python / pandas中的条件聚合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python / pandas中的条件聚合相关的知识,希望对你有一定的参考价值。
我有这样的数据帧:
Amount Month Type
15 201801 Sale
34 201801 Purchase
4 201801 Sale
86 201801 Purchase
23 201802 Sale
55 201802 Purchase
29 201802 Sale
...
我希望按月汇总它,以便我得到:
- 总销售额:总和(类型==销售额)
- 总销售额(运行):总和(月份的数量<=当前月份和类型==销售额)
- 总购买额:总和(类型==购买的金额)
- 总购买量(运行):总和(月份的数量<=当前月份和类型==购买)
所以......这样的事情:
Month TotalSales TotalSalesRun TotalPurch TotalPurchRun
201801 19 19 120 120
201802 52 71 55 175
我玩了一些东西,但我是lambda函数的新手,我怀疑这是我需要的地方。
答案
我正在使用concat
s1=df.groupby(['Month','Type']).sum()
s2=s1.groupby(level=1).cumsum().add_prefix('running')
s=pd.concat([s1,s2],axis=1).unstack()
s.columns=s.columns.map('_'.join)
或者让我们使用pivot_table
s1=df.pivot_table(index='Month',columns='Type',values='Amount',aggfunc='sum')
Yourdf=pd.concat([s1,s1.cumsum().add_prefix('Rolling')],sort=False,axis=1)
Yourdf
Type Purchase Sale RollingPurchase RollingSale
Month
201801 120 19 120 19
201802 55 52 175 71
另一答案
使用GroupBy.sum
进行聚合,通过Series.unstack
和DataFrame.add_prefix
重新计算DataFrame.join
和DataFrame.cumsum
的累计和:
df1 = df.groupby(['Month', 'Type'])['Amount'].sum().unstack().add_prefix('Total')
df2 = df1.join(df1.cumsum().add_suffix('Run')).sort_index(axis=1)
print (df2)
Type TotalPurchase TotalPurchaseRun TotalSale TotalSaleRun
Month
201801 120 120 19 19
201802 55 175 52 71
最后如果需要来自index
的列:
df2 = df2.reset_index().rename_axis(None, axis=1)
print (df2)
Month TotalPurchase TotalPurchaseRun TotalSale TotalSaleRun
0 201801 120 120 19 19
1 201802 55 175 52 71
另一答案
您可以使用groupby。或者,在切片数据帧时使用条件。例如,
total_sales = sum(df["Amount"][df.Type == 'Sale'])
以上是关于python / pandas中的条件聚合的主要内容,如果未能解决你的问题,请参考以下文章