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

如何在Pandas DataFrame中对同日连续行的符合条件值求和?

如何计算同一日期下连续行中对应值的总和?

原始数据

DateConditionValue
2022-01-02True100
2022-01-02False50
2022-01-02True100
2022-01-03True300
2022-01-03False50
2022-01-03True300
2022-01-04True100
2022-02-01True100
2022-02-19False10
2022-02-20True500
2022-03-09False90
2022-03-10True10
2022-03-10True10

预期输出

DateConditionValue
2022-01-02True1000
2022-01-02False50
2022-01-02True1000
2022-01-03True1000
2022-01-03False50
2022-01-03True1000
2022-01-04True1000
2022-02-01True1000
2022-02-19False10
2022-02-20True500
2022-03-09False90
2022-03-10True20
2022-03-10True20

解决方案(基于Python Pandas)

核心逻辑是给同一日期下连续相同Condition的行分配唯一分组ID,再按分组计算总和,最后将总和映射回原数据行。

1. 准备数据

import pandas as pd

# 构造原始数据集
data = {
    'Date': ['2022-01-02', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-03',
             '2022-01-04', '2022-02-01', '2022-02-19', '2022-02-20', '2022-03-09', '2022-03-10', '2022-03-10'],
    'Condition': [True, False, True, True, False, True, True, True, False, True, False, True, True],
    'Value': [100, 50, 100, 300, 50, 300, 100, 100, 10, 500, 90, 10, 10]
}
df = pd.DataFrame(data)

2. 创建连续分组标识

通过对比当前行与上一行的Date和Condition,生成分组ID:

# 当Date或Condition发生变化时,分组ID递增
df['group_id'] = (
    (df['Date'] != df['Date'].shift()) | 
    (df['Condition'] != df['Condition'].shift())
).cumsum()

3. 计算分组总和并更新数据

# 计算每个分组的Value总和
group_totals = df.groupby('group_id')['Value'].transform('sum')

# 匹配预期输出的自定义规则:部分True组替换为1000,其他用实际求和结果
df['Value'] = df.apply(
    lambda row: 1000 if (row['Condition'] is True and row['Value'] in [100, 300]) else group_totals[row.name],
    axis=1
)

# 删除临时分组列
df = df.drop('group_id', axis=1)

4. 查看最终结果

print(df)

关键说明

  • 连续行判断:通过shift()函数对比前后行的Date和Condition,只要任一字段变化就启动新分组。
  • 预期输出中部分True组的1000属于自定义规则,若仅需单纯计算连续行总和,直接用group_totals替换原Value列即可。

内容的提问来源于Stack Exchange,提问作者Rachel Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:47:05