如何在Pandas DataFrame中对同日连续行的符合条件值求和?
如何计算同一日期下连续行中对应值的总和?
原始数据
| Date | Condition | Value |
|---|---|---|
| 2022-01-02 | True | 100 |
| 2022-01-02 | False | 50 |
| 2022-01-02 | True | 100 |
| 2022-01-03 | True | 300 |
| 2022-01-03 | False | 50 |
| 2022-01-03 | True | 300 |
| 2022-01-04 | True | 100 |
| 2022-02-01 | True | 100 |
| 2022-02-19 | False | 10 |
| 2022-02-20 | True | 500 |
| 2022-03-09 | False | 90 |
| 2022-03-10 | True | 10 |
| 2022-03-10 | True | 10 |
预期输出
| Date | Condition | Value |
|---|---|---|
| 2022-01-02 | True | 1000 |
| 2022-01-02 | False | 50 |
| 2022-01-02 | True | 1000 |
| 2022-01-03 | True | 1000 |
| 2022-01-03 | False | 50 |
| 2022-01-03 | True | 1000 |
| 2022-01-04 | True | 1000 |
| 2022-02-01 | True | 1000 |
| 2022-02-19 | False | 10 |
| 2022-02-20 | True | 500 |
| 2022-03-09 | False | 90 |
| 2022-03-10 | True | 20 |
| 2022-03-10 | True | 20 |
解决方案(基于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
相关产品推荐
相关产品推荐

