pandas 从DataFrame创建数据透视表,值列位于“底部”

agyaoht7  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(122)

有一个 Dataframe :

df = pd.DataFrame.from_dict({
    'A': ['A1','A1','A1','A1','A2','A2','A2','A2'],
    'B': ['B1','B1','B2','B2','B3','B3','B4','B4'],
    'C': ['one','two','one','two','one','two','one','two'],
    'D': [0, 0, np.nan, 1, 0, np.nan, 1, 1],
    'E': [1, 1, np.nan, 1, 0, np.nan, 1, 1]
})

因此,作为一个表,它看起来像这样:

我尝试将其按AB进行分组,并将列C移到header,这样列将重命名为('one', 'D'), ('one', 'E'), ('two', 'D'), ('two', 'E'),它将具有以下外观:

为了实现这一点,我尝试了pivot_tablegroup + unstack方法:

# Method 1
df.pivot_table(index=['A', 'B'], columns='C', values=['D', 'E'], aggfunc='sum', fill_value=0)

# Method 2
df.groupby(['A', 'B', 'C']).agg('sum').unstack(level=['D', 'E'])

这两种方法都返回相同的结果,其中作为列名的值位于最顶端:

如何移动列层或使用非常低的列级别上的值创建透视表?
或者更准确的问题:如何从df中获取映像2的 Dataframe ,而不是映像3的 Dataframe ?

nhhxz33t

nhhxz33t1#

如果可以使用旋转,则添加DataFrame.swaplevelDataFrame.sort_index

df = (df.pivot_table(index=['A', 'B'], 
                     columns='C', 
                     values=['D', 'E'], 
                     aggfunc='sum', fill_value=0)
        .swaplevel(axis=1)
        .sort_index(axis=1))
print (df)
C     one    two   
        D  E   D  E
A  B               
A1 B1   0  1   0  1
   B2   0  0   1  1
A2 B3   0  0   0  0
   B4   1  1   1  1

或者,如果可以使用聚合sum,则将DataFrame.stackSeries.unstack一起使用:

df = (df.groupby(['A', 'B', 'C']).sum()
        .stack()
        .unstack([-2,-1])
        )
print (df)
C      one       two     
         D    E    D    E
A  B                     
A1 B1  0.0  1.0  0.0  1.0
   B2  0.0  0.0  1.0  1.0
A2 B3  0.0  0.0  0.0  0.0
   B4  1.0  1.0  1.0  1.0

相关问题