基于Indicator值的Pandas分组累计求和、均值等计算问题
问题描述
需要基于DataFrame的Indicator字段,对所有Indicator为False的行计算Amount的累计求和、均值、中位数等统计量,并将结果对应到相邻的Indicator为True的行;完成后重置统计,从当前True行开始到下一个True行重复该逻辑。
输入DataFrame:
| Amount | Indicator |
|---|---|
| 10 | False |
| 20 | False |
| 5 | True |
| 8 | False |
| 4 | False |
| 6 | True |
预期输出DataFrame:
| Amount | Indicator | Sum | Mean |
|---|---|---|---|
| 10 | False | ||
| 20 | False | ||
| 5 | True | 30 | 15 |
| 8 | False | ||
| 4 | False | ||
| 6 | True | 12 | 6 |
(注:原预期输出中第二组Sum为17是笔误,8+4=12,Mean为6)
已尝试使用groupby结合cumsum()按Indicator分组,但未成功。
解决方案
核心思路是生成专属分组标识,将每个True行与它前面的所有未被分组的False行归为同一组,再对每组的False行计算统计量,最后合并回原DataFrame对应到True行。
代码实现
import pandas as pd # 创建示例DataFrame data = { 'Amount': [10, 20, 5, 8, 4, 6], 'Indicator': [False, False, True, False, False, True] } df = pd.DataFrame(data) # 生成分组ID:从后往前累加True标识,让每个False行归属到下一个True行的分组 df['group_id'] = df['Indicator'][::-1].cumsum()[::-1] # 计算每组中Indicator为False的行的统计量 stats = df[df['Indicator'] == False].groupby('group_id')['Amount'].agg( Sum='sum', Mean='mean', Median='median' ).reset_index() # 合并统计结果到原DataFrame,仅填充True行 df = df.merge(stats, on='group_id', how='left') df.loc[df['Indicator'] == False, ['Sum', 'Mean', 'Median']] = None # 移除临时分组列 df = df.drop('group_id', axis=1) print(df)
输出结果
Amount Indicator Sum Mean Median 0 10 False NaN NaN NaN 1 20 False NaN NaN NaN 2 5 True 30.0 15.0 15.0 3 8 False NaN NaN NaN 4 4 False NaN NaN NaN 5 6 True 12.0 6.0 6.0
关键逻辑说明
- 分组ID生成:
df['Indicator'][::-1].cumsum()[::-1]反向遍历并累加True的数量,这样每个False行都会被标记为下一个True行的分组ID,确保每个True行对应前面的一组False行。 - 统计计算:仅对每组内
Indicator为False的行计算统计量,避免包含True行本身的Amount值。 - 结果合并:通过
merge将统计结果匹配到对应分组的True行,再将False行的统计列置空,符合预期格式。
内容的提问来源于stack exchange,提问作者ALphaCS
相关产品推荐
相关产品推荐

