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

如何计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:18:02