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

如何在Pandas DataFrame或Python列表中识别子总计及其对应行?

如何在Pandas DataFrame或Python列表中识别子总计及其对应数据行?

示例数据

import pandas as pd

data = {
    'running': [False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, True, False, True],
    'value': [50709, 26715, 1715, 79139, 34447, -7256, 1210, 42913, 36227, 999, 20107, 5787, -1466, -216, 615, 24827, 11400, 5642, 5758, -5, 5753]
}
df = pd.DataFrame(data)

数据说明

  • 数值符号可能存在错误
  • 数据包含子总计和运行总计:行索引[3,7,15]为子总计,[8,16,18,20]为运行总计
  • 行索引3的子总计同时也是运行总计
  • 运行总计已通过其他方式识别并标记为running=True
  • 子总计[3,7,15]分别对应行[0,1,2]、[4,5,6]和[10,11,12,13,14]的数值之和
  • 子总计紧跟在对应连续数值子集之后
  • 数据中可能不存在任何子总计
  • 暂不考虑子总计嵌套包含更小的子总计的情况
  • 数据行数不超过100行

解决方案

思路

由于数据规模小,采用向前枚举验证的方法:

  1. 排除已标记为运行总计的行(避免重复验证)
  2. 对每一行,向前遍历连续的非运行总计行,计算累加和
  3. 验证累加和是否等于当前行数值(考虑符号错误,同时检查绝对值匹配)
  4. 记录符合条件的子总计及其对应数据行

代码实现

def find_subtotals(df):
    subtotals = []
    # 获取所有非运行总计的行索引
    non_running_indices = df[df['running'] == False].index.tolist()
    
    for idx in non_running_indices:
        current_val = df.loc[idx, 'value']
        sum_candidate = 0
        corresponding_rows = []
        # 从当前行前一行开始向前遍历,直到遇到运行总计或数据开头
        for prev_idx in range(idx-1, -1, -1):
            if df.loc[prev_idx, 'running']:
                break
            sum_candidate += df.loc[prev_idx, 'value']
            corresponding_rows.insert(0, prev_idx)
            # 检查累加和与当前值是否匹配(含符号错误情况)
            if sum_candidate == current_val or sum_candidate == -current_val:
                subtotals.append({
                    'subtotal_index': idx,
                    'subtotal_value': current_val,
                    'corresponding_indices': corresponding_rows,
                    'matched_sum': sum_candidate
                })
                break
    return subtotals

# 执行并输出结果
result = find_subtotals(df)
for item in result:
    print(f"子总计行索引: {item['subtotal_index']},数值: {item['subtotal_value']}")
    print(f"对应数据行索引: {item['corresponding_indices']},匹配累加和: {item['matched_sum']}\n")

输出结果

子总计行索引: 3,数值: 79139
对应数据行索引: [0, 1, 2],匹配累加和: 79139

子总计行索引: 7,数值: 42913
对应数据行索引: [4, 5, 6],匹配累加和: 42913

子总计行索引: 15,数值: 24827
对应数据行索引: [10, 11, 12, 13, 14],匹配累加和: 24827

补充说明

  • 代码跳过running=True的行,因为这类行已被标记为运行总计
  • 针对数值符号可能错误的情况,同时验证了累加和等于当前值或其相反数的场景
  • 找到匹配序列后立即停止向前遍历,符合“子总计紧跟对应数据行”的假设
  • 若无符合条件的子总计,函数返回空列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:03:16