熊猫数据框枢轴

时间:2019-08-16 02:27:33

标签: python pandas

我正在尝试将df111转换为df222:

enter image description here enter image description here

   ID1 ID2 Type  Value
0   1   a    X      1
1   1   a    Y      2
2   1   b    X      3
3   1   b    Y      4
4   2   a    X      5
5   2   a    Y      6
6   2   b    X      7
7   2   b    Y      8



   ID1 ID2  X Value  Y Value
0   1   a        1        2
1   1   b        3        4
2   2   a        5        6
3   2   b        7        8

我尝试了df111.pivot()和df111.groupby(),但是没有运气。有人可以把我扔掉吗?谢谢

3 个答案:

答案 0 :(得分:1)

您可以先行set_index前三列,然后再行unstack。为了适合确切的输出,请通过保留第二级和reset_index来重命名列,例如:

df222 = df111.set_index(['ID1', 'ID2','Type']).unstack()
df222.columns = [col[1] + ' Value' for col in df222.columns]
df222 = df222.reset_index()

print (df222)
   ID1 ID2  X Value  Y Value
0    1   a        1        2
1    1   b        3        4
2    2   a        5        6
3    2   b        7        8

,如果您想使用链接方法:

df222 = df111.set_index(['ID1', 'ID2','Type']).Value.unstack()\
             .rename(columns = {'X': 'X Value', 'Y': 'Y Value'})\ 
             .rename_axis(None, axis="columns")\
             .reset_index()

答案 1 :(得分:1)

如果您具有ivot_table函数,那么为什么要提供数据透视?这只是令人困惑...

df333 = pd.pivot_table(df111, index=['ID1','ID2'], columns=['Type'], values='Value')
df333.reset_index()

答案 2 :(得分:0)

df222 = (df111.set_index(['ID1', 'ID2','Type']).unstack()
     .add_suffix(' Value'))
df222.columns=[lev[1] for lev in df222.columns]
df222.reset_index(inplace=True)