pandas:按自定义类别分组,然后转动?

时间:2016-07-01 00:14:13

标签: python pandas

我有一个如下所示的数据框:

              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

我想创建一个新的数据框,每个公司都有一行,还有两列:咨询费用总额,以及其他所有内容的总支出,意味着事件+旅行。

所以看起来应该是这样的:

 Company Name        Spend Consultancy     Spend Other
 Teva UK Limited     653.000               602.000
 Meda Pharma         0.000                 459.860

这样做的最佳方式是什么?

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

df.groupby(('Company Name', 'Category')).sum()

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用assign()创建仅包含cat类别的新['Consultancy', 'Other']列,然后在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作为常规列:

In [17]: %paste
(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)
   .reset_index()
)
## -- End pasted text --
Out[17]:
cat       Company Name  Consultancy   Other
0    Eli & Company Ltd          0.0   15.00
1                 Meda          0.0  459.86
2         Teva Limited        655.3  602.00

说明:

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

答案 1 :(得分:0)

这应该这样做:

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