有条件的Pandasgroupby.agg

yuvru6vn  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个Pandas的数据框架,类似于这个:
| 姓名|销售额|利润|利润_标志|
| - ------|- ------|- ------|- ------|
| 乔|二百|一百|真的|
| 乔|三百|一百五十|假|
| 马克|二百|一百|真的|
| 马克|三百|一百五十|真的|
| 朱蒂|三百|一百五十|假|
实际的数据框有100列。
其理念是:我想按名称分组,并聚集所有列。但是,某些列依赖于标志。在这种情况下,无论如何都将聚集sales,但只有当profit_flagTrue时,profit才应包括在聚集中。
如果我们使用sum,它应该是这样的:
| 姓名|销售额|利润|
| - ------|- ------|- ------|
| 乔|五百|一百|
| 朱蒂|三百|南姓|
| 马克|五百|二百五十|
有没有什么办法可以用df.groupby('name').agg()在一行代码中完成这个任务?
现在我正在使用:

grouped = pd.DataFrame()
grouped['sales'] = df.groupby('name').sales.sum()
grouped['profit'] = df[df.profit_flag].groupby('name').profit.sum()

我得到了正确的结果,但是由于实际的 Dataframe 有更多的列,我想知道我是否可以编写这样的代码来避免混乱:

grouped = df.groupby('name').agg({
          'sales': 'sum',
          'profit' 'sum' #if profit_flag })

这甚至是可能的,或者我应该只是分组'标志依赖列'在单独的状态?

kgsdhlau

kgsdhlau1#

您可以在聚合之前屏蔽这些值:

(df.assign(profit=lambda d: d['profit'].where(d['profit_flag']))
   .groupby('name', as_index=False)[['sales', 'profit']].sum(min_count=1)
)

输出:

name  sales  profit
0   Joe    500   100.0
1  Judy    300     NaN
2  Mark    500   250.0

相关问题