首页 > 解决方案 > 在执行数据透视时从列值中获取列标题

问题描述

我有一个看起来像这样的 DataFrame:

Customer    ProductCategory    TimeFrame    Sales    Returns
Greg        Soap               CY           5        1
Phil        Towels             PY           2        3
Greg        Soap               PY           7        
Greg        Towels             CY           3        

我想旋转这个 DataFrame 以便我得到这样的东西:

Customer    ProductCategory    Measure    CY    PY
Greg        Soap               Sales      5     7
Greg        Soap               Returns    1      
Greg        Towels             Sales      3     
Greg        Towels             Returns           
Phil        Towels             Sales            2
Phil        Towels             Returns          3

上面的缺失值应该为空。我不想填满它们。

我尝试了一些不同的方法。我得到的最接近的是pivot_tablemelt,groupby和一起使用stack

pd.pivot_table(df, values=['Sales', 'Returns'], index=['Customer', 'ProductCategory'], columns=['TimeFrame'], aggfunc=np.sum) \
.reset_index() \
.melt(id_vars=['Customer', 'ProductCategory']) \
.rename(columns={None: 'Measure'}) \
.groupby(by=['Customer', 'ProductCategory', 'Measure', 'TimeFrame'])['value'] \
.aggregate('first') \
.unstack() \
.reset_index()

这导致以下结果:

TimeFrame   Customer    ProductCategory    Measure    CY    PY
0           Greg        Soap               Returns    1.0   0.0
1           Greg        Soap               Sales      5.0   7.0
2           Greg        Towels             Returns    0.0   NaN
3           Greg        Towels             Sales      3.0   NaN
4           Phil        Towels             Returns    NaN   3.0
5           Phil        Towels             Sales      NaN   2.0

这里的问题是一些空数值已被零填充。此外,即使我应用了 reset_index,索引现在也被命名为“TimeFrame”?

最后,我很好奇是否有一种我想念的更有效的方法来做到这一点。既然pivot_table让我大部分时间到达那里,是否有我遗漏的参数或类似的东西?

标签: pythonpandasdataframepivot-table

解决方案


你只需要meltpivot_table

(df.melt(['Customer','ProductCategory','TimeFrame'], var_name='Measure')
   .pivot_table(index=['Customer','ProductCategory','Measure'],
                columns='TimeFrame',values='value')
   .reset_index()
)

输出:

TimeFrame Customer ProductCategory  Measure   CY   PY
0             Greg            Soap  Returns  1.0  NaN
1             Greg            Soap    Sales  5.0  7.0
2             Greg          Towels    Sales  3.0  NaN
3             Phil          Towels  Returns  NaN  3.0
4             Phil          Towels    Sales  NaN  2.0

要删除索引/列的名称,请将上面的链接与rename_axis(index=None,columns=None)


推荐阅读