You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Indicator值的Pandas分组累计求和、均值等计算问题

问题描述

需要基于DataFrame的Indicator字段,对所有Indicator为False的行计算Amount的累计求和、均值、中位数等统计量,并将结果对应到相邻的Indicator为True的行;完成后重置统计,从当前True行开始到下一个True行重复该逻辑。

输入DataFrame:

AmountIndicator
10False
20False
5True
8False
4False
6True

预期输出DataFrame:

AmountIndicatorSumMean
10False
20False
5True3015
8False
4False
6True126

(注:原预期输出中第二组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

关键逻辑说明

  1. 分组ID生成:df['Indicator'][::-1].cumsum()[::-1] 反向遍历并累加True的数量,这样每个False行都会被标记为下一个True行的分组ID,确保每个True行对应前面的一组False行。
  2. 统计计算:仅对每组内Indicator为False的行计算统计量,避免包含True行本身的Amount值。
  3. 结果合并:通过merge将统计结果匹配到对应分组的True行,再将False行的统计列置空,符合预期格式。

内容的提问来源于stack exchange,提问作者ALphaCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:56