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

如何基于两列表头值向Pandas插入可复用的百分比差异列

可复用的成绩对比差异列生成方案

思路

先自动找出合并后带_1、_2后缀的科目列对,给每一对计算百分比差异,然后把差异列插到对应科目两列的后面,同时保留Name这类固定列的位置,不管以后加多少固定列或者新科目,都不用改代码。

代码实现

import pandas as pd

# 模拟测试数据
df_1 = pd.DataFrame({'Name': ['张三', '李四'], 'Math': [80, 90], 'English': [75, 85]})
df_2 = pd.DataFrame({'Name': ['张三', '李四'], 'Math': [85, 88], 'English': [80, 82]})
# 合并成对比表
merged_df = pd.merge(df_1, df_2, on='Name', suffixes=('_1', '_2'))

def add_diff_columns(df, suffixes=('_1', '_2')):
    # 自动提取所有科目的前缀(排除固定列)
    subject_prefixes = set(col.rsplit('_', 1)[0] for col in df.columns if suffixes[0] in col)
    # 构建新的列顺序
    new_col_order = []
    for col in df.columns:
        new_col_order.append(col)
        # 遇到_1后缀的科目列,就插入对应的差异列
        if col.endswith(suffixes[0]):
            subject = col.rsplit('_', 1)[0]
            col_2 = f"{subject}{suffixes[1]}"
            # 计算百分比差异:((新成绩-旧成绩)/旧成绩)*100,处理除数为0的情况
            df[f"{subject}_diff_pct"] = ((df[col_2] - df[col]) / df[col].replace(0, pd.NA)) * 100
            new_col_order.append(f"{subject}_diff_pct")
    # 重新排列列,返回结果
    return df[new_col_order]

# 生成最终结果
result_df = add_diff_columns(merged_df)
print(result_df)

说明

  • 自动识别科目:靠后缀_1找所有科目,不用手动列科目名,以后加新科目或者新固定列都能适配。
  • 避免除以0报错:把成绩为0的情况替换成缺失值,防止计算时出错。
  • 列顺序不乱:遍历原列的时候,每遇到一个_1列就马上插差异列,保证科目列、对比列、差异列是挨在一起的,看着清楚。
  • 灵活适配:函数支持自定义后缀,只要合并时用的后缀和函数参数一致就行,通用性强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:15:32