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

如何批量计算合并后DataFrame中同名列的百分比差异?

哈哈,这个场景太常见了——合并完两个DataFrame后一堆带_x/_y的列,要挨个算差异简直要疯!我给你一套高效的批量处理方案,既能覆盖所有同名指标,又能保持代码清爽:

核心思路

先从合并后的DataFrame中提取所有配对的_x/_y列,然后利用pandas的向量化操作批量计算百分比差异,避免低效的逐行循环。

具体实现步骤

1. 提取配对列名

首先筛选出所有带_x后缀的列,再通过字符串匹配找到对应的_y列:

# 假设合并后的DataFrame名为 merged_df
x_cols = [col for col in merged_df.columns if col.endswith('_x')]
base_cols = [col[:-2] for col in x_cols]  # 去掉_x后缀,得到原始列名(比如"score_x"→"score")
y_cols = [f"{col}_y" for col in base_cols]  # 对应_y列名

2. 批量计算百分比差异

这里推荐用assign+字典推导式的写法,既简洁又符合pandas的向量化高效特性:

# 定义百分比差异计算函数(可根据需求自定义)
def calculate_pct_diff(x_series, y_series):
    # 处理分母为0的情况,避免ZeroDivisionError
    return ((x_series - y_series) / y_series.where(y_series != 0, 1)) * 100

# 批量生成差异列,列名格式为「原始列名_pct_diff」
merged_df = merged_df.assign(
    **{
        f"{base}_pct_diff": calculate_pct_diff(merged_df[x_col], merged_df[y_col])
        for base, x_col, y_col in zip(base_cols, x_cols, y_cols)
    }
)

如果你更喜欢直观的循环写法(适合新手理解),也可以这样:

for base, x_col, y_col in zip(base_cols, x_cols, y_cols):
    merged_df[f"{base}_pct_diff"] = ((merged_df[x_col] - merged_df[y_col]) / merged_df[y_col].where(merged_df[y_col] != 0, 1)) * 100

优化与自定义说明

  • 处理分母为0:用y_series.where(y_series != 0, 1)把分母为0的情况替换为1,避免报错。你也可以根据需求改成pd.NA或者其他默认值。
  • 自定义差异公式:如果你的百分比差异逻辑不同(比如以_x为基准、取绝对值差异等),直接修改calculate_pct_diff函数即可:
    # 示例:以_x为基准计算差异
    def calculate_pct_diff(x_series, y_series):
        return ((x_series - y_series) / x_series.where(x_series != 0, 1)) * 100
    
    # 示例:计算绝对值的相对差异(用平均值做基准)
    def calculate_pct_diff(x_series, y_series):
        avg = (x_series + y_series) / 2
        return (abs(x_series - y_series) / avg.where(avg != 0, 1)) * 100
    
  • 效率优先:assign+字典推导式的写法是pandas推荐的向量化操作,在大数据量下比循环快得多。

完整示例

假设你的原始数据是这样的:

import pandas as pd

df1 = pd.DataFrame({'id': [1,2,3], 'score': [80,90,75], 'sales': [1000,2000,1500]})
df2 = pd.DataFrame({'id': [1,2,3], 'score': [80,90,80], 'sales': [1000,2000,1600]})
merged_df = pd.merge(df1, df2, on='id', how='outer')

运行上述代码后,merged_df会新增score_pct_diff和sales_pct_diff列,第三行的score_pct_diff会是-6.25(对应(75-80)/80*100),完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:37:51