Pandas:按自定义类别分组,然后旋转?

2024-06-26 10:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框架,它看起来如下:

              Company Name                          Category  Amount
0             Teva Limited  Consultancy                     650.000
1             Teva Limited  Consultancy                       5.300
2        Eli & Company Ltd  Events                           15.000
3                     Meda  Events                           60.000
4             Teva Limited  Events                          400.000
4             Teva Limited  Travel                          202.000
4                     Meda  Travel                          399.860

我想为每个公司创建一个新的数据框架,其中有一行,两列:咨询费用总额,以及所有其他方面的花费,这意味着事件+旅行。

所以它应该是这样的:

^{pr2}$

做这件事最好的方法是什么?

我按名称和类别对其进行分组,并将金额汇总,这是一个开始:

^{pr3}$

但是现在我不确定如何以定制的方式将类别组合在一起,或者如何将它们转换为列。我想我可能需要一张透视表?

谢谢你的帮助!


Tags: 数据name框架events类别amountcompanycategory
2条回答

您可以使用assign()创建只包含['Consultancy', 'Other']类别的新cat列,然后在pivot_table()函数中使用此新列:

In [10]: (df.assign(cat=np.where(df.Category=='Consultancy', df.Category, 'Other'))
   ....:    .pivot_table(index='Company Name', columns='cat', values='Amount',
   ....:                 aggfunc='sum', fill_value=0)
   ....: )
Out[10]:
cat                Consultancy   Other
Company Name
Eli & Company Ltd          0.0   15.00
Meda                       0.0  459.86
Teva Limited             655.3  602.00

或者将Company Name作为常规列:

^{pr2}$

说明:

In [11]: df.assign(cat=np.where(df.Category=='Consultancy', df.Category, 'Other'))
Out[11]:
        Company Name     Category  Amount          cat
0       Teva Limited  Consultancy  650.00  Consultancy
1       Teva Limited  Consultancy    5.30  Consultancy
2  Eli & Company Ltd       Events   15.00        Other
3               Meda       Events   60.00        Other
4       Teva Limited       Events  400.00        Other
5       Teva Limited       Travel  202.00        Other
6               Meda       Travel  399.86        Other

这应该做到:

cdf = df.groupby([df['Company Name'], df.Category == 'Consultancy']).Amount.sum().unstack().fillna(0)
cdf.set_axis(1, ['Other', 'Consultancy'])
print cdf

                    Other  Consultancy
Company Name                          
Eli & Company Ltd   15.00          0.0
Meda               459.86          0.0
Teva Limited       602.00        655.3

相关问题 更多 >