Python 在pandas中的groupby之后转置某些列

Python 在pandas中的groupby之后转置某些列,python,pandas,dataframe,Python,Pandas,Dataframe,嘿,我正在努力转换数据帧: 初始帧的格式如下所示: df=pd.DataFrame({'A':['A1','A1','A1','A1','A1','A2','A2','A2','A2','A3','A3','A3','A3'], 'B':['B1','B1','B1','B1','B2','B2','B2','B3','B3','B3','B4','B4','B4'], 'C':['C1','C1','C1','C2','C2','C3','C3','C4',

嘿,我正在努力转换数据帧:

初始帧的格式如下所示:

df=pd.DataFrame({'A':['A1','A1','A1','A1','A1','A2','A2','A2','A2','A3','A3','A3','A3'],
         'B':['B1','B1','B1','B1','B2','B2','B2','B3','B3','B3','B4','B4','B4'],
         'C':['C1','C1','C1','C2','C2','C3','C3','C4','C4','C5','C5','C6','C6'],
         'X':['a','b','c','a','c','a','b','b','c','a','c','a','c'],
         'Y':[1,4,4,2,4,1,4,3,1,2,3,4,5]})


    A   B   C   X   Y
    A1  B1  C1  a   1
    A1  B1  C1  b   4
    A1  B1  C1  c   4
    A1  B1  C2  a   2
    A1  B2  C2  c   4
    A2  B2  C3  a   1
    A2  B2  C3  b   4
    A2  B3  C4  b   3
    A2  B3  C4  c   1
    A3  B3  C5  a   2
    A3  B4  C5  c   3
    A3  B4  C6  a   4
    A3  B4  C6  c   5
我想在开头的一些列中应用groupby,然后转置最后两列:

首先
df.groupby(['A','B','C','X']).sum()

然后转换X/Y列并水平添加它们

A   B   C   a   b   c
A1  B1  C1  1.0 4.0 4.0
A1  B1  C2  2.0 NaN NaN
A1  B2  C2  NaN NaN 4.0
A2  B2  C3  1.0 4.0 NaN
A2  B3  C4  NaN 3.0 1.0
A3  B3  C5  2.0 NaN NaN
A3  B4  C5  NaN NaN 3.0
A3  B4  C6  4.0 NaN 5.0
并非所有groupby行都具有所有值,因此它们需要用类似于np.nan的内容填充。 这个问题与此相关,但它更复杂,我无法理解。

用于重塑:

df1 = (df.groupby(['A','B','C','X'])['Y'].sum()
         .unstack()
         .reset_index()
         .rename_axis(None, axis=1))
print (df1)
    A   B   C    a    b    c
0  A1  B1  C1  1.0  4.0  4.0
1  A1  B1  C2  2.0  NaN  NaN
2  A1  B2  C2  NaN  NaN  4.0
3  A2  B2  C3  1.0  4.0  NaN
4  A2  B3  C4  NaN  3.0  1.0
5  A3  B3  C5  2.0  NaN  NaN
6  A3  B4  C5  NaN  NaN  3.0
7  A3  B4  C6  4.0  NaN  5.0
备选方案包括:

df1 = (df.groupby(['A','B','C','X'])['Y'].sum()
         .unstack()
         .reset_index()
         .rename_axis(None, axis=1))
print (df1)
    A   B   C    a    b    c
0  A1  B1  C1  1.0  4.0  4.0
1  A1  B1  C2  2.0  NaN  NaN
2  A1  B2  C2  NaN  NaN  4.0
3  A2  B2  C3  1.0  4.0  NaN
4  A2  B3  C4  NaN  3.0  1.0
5  A3  B3  C5  2.0  NaN  NaN
6  A3  B4  C5  NaN  NaN  3.0
7  A3  B4  C6  4.0  NaN  5.0
df1 = (df.pivot_table(index=['A','B','C'],
                      columns='X',
                      values='Y',
                      aggfunc='sum').reset_index().rename_axis(None, axis=1))
print (df1)
    A   B   C    a    b    c
0  A1  B1  C1  1.0  4.0  4.0
1  A1  B1  C2  2.0  NaN  NaN
2  A1  B2  C2  NaN  NaN  4.0
3  A2  B2  C3  1.0  4.0  NaN
4  A2  B3  C4  NaN  3.0  1.0
5  A3  B3  C5  2.0  NaN  NaN
6  A3  B4  C5  NaN  NaN  3.0
7  A3  B4  C6  4.0  NaN  5.0