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

基于key列对两个Pandas DataFrame多列做减法并保留无关列

高效实现方案(全向量化操作,无循环,适合大数据量场景)

推荐优先使用索引对齐法,性能最优,利用pandas原生的索引对齐特性,不需要手动逐行匹配:

1. 索引对齐法实现代码

import pandas as pd

# --------------- 示例数据构造 ---------------
df1 = pd.DataFrame({
    'A': ['x', 'y', 'z'],
    'B': ['j', 'k', 'l'],
    'C': [5, 7, 9],
    'D': [2, 3, 4]
})
df2 = pd.DataFrame({
    'A': ['z', 'x', 'y'],
    'B': ['o', 'p', 'q'],
    'C': [1, 2, 3],
    'D': [1, 1, 1]
})

# --------------- 核心逻辑 ---------------
# 将A列设为索引,仅提取df2中需要参与运算的C、D列
df2_calc = df2.set_index('A')[['C', 'D']]
df1 = df1.set_index('A')
# 直接做列减法,仅修改C、D列,B列全程不会被改动
df1[['C', 'D']] = df1[['C', 'D']] - df2_calc
# 重置索引将A列恢复为普通列,得到最终结果df3
df3 = df1.reset_index()

如果存在Df2没有的key值,可补充reindex操作避免出现空值:

df1[['C', 'D']] = df1[['C', 'D']] - df2_calc.reindex(df1.index, fill_value=0)

2. Merge关联法(逻辑更直观)

如果更倾向于显式关联的逻辑,可使用merge方法:

# 按A列关联,仅保留df2的C、D列,加后缀区分来源
merge_temp = df1.merge(df2[['A', 'C', 'D']], on='A', suffixes=('', '_df2'))
# 计算新的C、D列
merge_temp['C'] = merge_temp['C'] - merge_temp['C_df2']
merge_temp['D'] = merge_temp['D'] - merge_temp['D_df2']
# 提取需要的列得到最终结果
df3 = merge_temp[['A', 'B', 'C', 'D']]

两种方法的时间复杂度均为O(n+m),相比逐行循环的O(n*m)复杂度,处理十万行以上数据时性能提升可达上千倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:24:04