我有一个类似于这样的pandas数据框:
姓名 | 销售额 | 利润 | 利润标志 |
---|---|---|---|
乔 | 200 | 100 | 是 |
乔 | 300 | 150 | 否 |
马克 | 200 | 100 | 是 |
马克 | 300 | 150 | 是 |
朱迪 | 300 | 150 | 否 |
实际数据框有100列。
这个想法是:我想按名称分组,并聚合所有列。但是,某些列取决于一个标志。在这种情况下,无论如何都将聚合sales
,但只有当profit_flag
为True时才应包括在聚合中。
如果我们使用sum
,它应该看起来像这样:
名称 | 销售额 | 利润 |
---|---|---|
乔 | 500 | 100 |
朱迪 | 300 | Nan |
马克 | 500 | 250 |
有没有办法可以使用df.groupby('name').agg()
一行代码完成?
目前我正在使用:
grouped = pd.DataFrame()
grouped['sales'] = df.groupby('name').sales.sum()
grouped['profit'] = df[df.profit_flag].groupby('name').profit.sum()
我得到了正确的结果,但由于实际数据框有更多的列,我想知道是否可以写出像这样的东西来避免混乱:
grouped = df.groupby('name').agg({
'sales': 'sum',
'profit' 'sum' #if profit_flag })
这个可行吗,还是我应该将“标志依赖列”分组在单独的语句中?
pop('profit_flag')
:df.assign(profit=lambda x: x['profit'].where(x.pop('profit_flag'))).groupby('name').sum(min_count=1)
- Corralienlambda
:df.assign(profit=df['profit'].where(df['profit_flag'])).groupby('name', as_index=False)[['sales', 'profit']].sum(min_count=1)
。为什么要重新评估数据框呢? - Corralien.agg
在另一个语句中聚合所有列。 - Samba.assign(**{'name with %': ...})
。 - mozway