我有一个如下所示的数据框:
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()
但是现在我不确定如何以定制的方式将类别组合在一起,或者如何将它们转换为列。我想我可能需要一个数据透视表?
感谢您的帮助!
答案 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