如何在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行
解决方案
思路
由于数据规模小,采用向前枚举验证的方法:
- 排除已标记为运行总计的行(避免重复验证)
- 对每一行,向前遍历连续的非运行总计行,计算累加和
- 验证累加和是否等于当前行数值(考虑符号错误,同时检查绝对值匹配)
- 记录符合条件的子总计及其对应数据行
代码实现
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
相关产品推荐
相关产品推荐

