如何计算pandas DataFrame中各主体每月的贷方减借方差额?
问题分析
原有代码无法得到预期结果的核心问题如下:
- 原数据除首列外所有借贷列均重复使用
Debit/Credit作为列名,直接按列名取值只会返回第一组(第一个月)的对应数据,无法匹配后续月份的借贷值 - 未按月份配对处理每两组借贷列,也没有为
Month字段填入对应月份标识 - 初始化字典定义的键为
Party,但遍历代码中错误写入了不存在的键Particulars
可行实现方案
首先你需要先整理出和列顺序匹配的月份列表,比如原数据列的顺序为1月、2月、3月...对应,就按这个顺序生成month_list = ['jan', 'feb', 'march', ...]即可。
方案1:pandas向量化转换(推荐)
使用pandas内置的宽表转长表函数实现,无需手动遍历,代码简洁不易出错:
import pandas as pd # 替换为你实际的月份列表,顺序必须和原数据中月份出现的顺序完全一致 month_list = ['jan', 'feb', 'march'] # 1. 重命名列,为每一组借贷列加上月份前缀 new_cols = ['party'] for month in month_list: new_cols.extend([f"{month}_Debit", f"{month}_Credit"]) new_data_set.columns = new_cols # 2. 宽表转长表 long_df = pd.wide_to_long( new_data_set, stubnames=['Debit', 'Credit'], i='party', j='Month', sep='_', suffix=r'\w+' ).reset_index() # 3. 计算差值并输出结果 long_df['Total'] = long_df['Credit'] - long_df['Debit'] result = long_df[['party', 'Month', 'Total']].rename(columns={'party': 'Party'})
方案2:修正后的iterrows遍历方案
如果需要保留遍历逻辑,可使用以下修正后的代码,仅推荐小数据量场景使用:
data_set = { "Party": [], "Month": [], "Total": [] } # 替换为你实际的月份列表,顺序必须和原数据中月份出现的顺序完全一致 month_list = ['jan', 'feb', 'march'] for _, row in new_data_set.iterrows(): current_party = row['party'] # 按顺序遍历每一个月份,每两个列对应一个月的借贷数据 for month_idx, month_name in enumerate(month_list): debit_col_pos = 1 + month_idx * 2 credit_col_pos = debit_col_pos + 1 current_total = row[credit_col_pos] - row[debit_col_pos] data_set['Party'].append(current_party) data_set['Month'].append(month_name) data_set['Total'].append(current_total) result = pd.DataFrame(data_set)
内容的提问来源于stack exchange,提问作者Vishal Patil
相关产品推荐
相关产品推荐

