如何在Pandas中合并groupby、cumsum与乘积计算为单条语句?
可行的合并方案
你的尝试失败是因为apply返回分组内的乘积序列后,直接调用.cumsum()是对整个结果做全局累加,而非你需要的分组内累加。以下是两种无需临时列的高效合并方案:
方案一:矢量化分组累加(推荐,效率最高)
直接先计算所有行的乘积,再按event分组执行cumsum,一行代码完成:
df['accum_product'] = (df['weight'] * df['score']).groupby(df['event']).cumsum()
这个方法利用pandas的矢量化操作,比apply快得多,完全避免临时列的创建。
方案二:使用apply完成分组内累加(不推荐,效率较低)
如果一定要用apply,需要在lambda内部完成分组内的乘积和累加,最后展开结果对齐原数据:
df['accum_product'] = df.groupby('event').apply(lambda x: (x['weight'] * x['score']).cumsum()).explode()
这里explode()的作用是把分组后的序列展开成原DataFrame的行长度,保证结果和原数据行一一对应。
验证示例
假设你的DataFrame是:
| event | weight | score |
|---|---|---|
| A | 2 | 3 |
| A | 4 | 5 |
| B | 1 | 2 |
| B | 3 | 4 |
两种方案都会得到:
| event | weight | score | accum_product |
|---|---|---|---|
| A | 2 | 3 | 6 |
| A | 4 | 5 | 26 |
| B | 1 | 2 | 2 |
| B | 3 | 4 | 14 |
和你原来的临时列方法结果完全一致。
内容的提问来源于stack exchange,提问作者bobgott
相关产品推荐
相关产品推荐

