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.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
另一答案

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

total_sales = sum(df["Amount"][df.Type == 'Sale'])

以上是关于python / pandas中的条件聚合的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 条件聚合和非条件聚合在一起

如何在 python Pandas 中执行/解决条件连接?

python--pandas分组聚合

数据分析—Pandas 中的分组聚合Groupby 高阶操作

pandas 数据框中的聚合,其中一行中的列名

利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)