基于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
相关产品推荐
相关产品推荐

