python / pandas中的条件聚合

问题描述 投票:2回答:3

我有这样的数据帧:

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函数的新手,我怀疑这是我需要的地方。

python python-3.x pandas
3个回答
6
投票

我正在使用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

3
投票

使用GroupBy.sum进行聚合,通过Series.unstackDataFrame.add_prefix重新计算DataFrame.joinDataFrame.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

1
投票

您可以使用groupby。或者,在切片数据帧时使用条件。例如,

total_sales = sum(df["Amount"][df.Type == 'Sale'])
© www.soinside.com 2019 - 2024. All rights reserved.