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

如何对行、列索引均不同的两个Pandas DataFrame执行减法运算?

解决DataFrame行/列索引不一致时的减法需求

你遇到的问题是pandas默认的sub()方法只会在两个DataFrame共同的行和列索引上执行运算,缺失的位置会返回NaN,但你需要把缺失的行/列视为0来参与计算。不管是单轴还是双轴(行+列)索引不一致的情况,都可以通过先对齐索引并填充缺失值为0的方式解决。

具体实现步骤

  1. 获取两个DataFrame的行索引并集和列索引并集;
  2. 用这两个并集分别对df1和df2进行重索引,缺失值填充为0;
  3. 对重索引后的两个DataFrame执行减法运算。

代码示例

先构造你给出的示例数据:

import pandas as pd

# 构造df1
df1_data = {
    'A': [1,1,1],
    'B': [2,5,5],
    'C': [4,1,0],
    'D': [0,3,1],
    'E': [1,1,0]
}
df1 = pd.DataFrame(df1_data, index=['ZA', 'ZB', 'ZC'])

# 构造df2
df2_data = {
    'A': [4,5,0],
    'B': [6,1,9],
    'C': [5,5,5],
    'D': [0,9,3]
}
df2 = pd.DataFrame(df2_data, index=['ZA', 'ZB', 'ZD'])

然后执行索引对齐和减法:

# 获取行、列的并集
all_rows = df1.index.union(df2.index)
all_cols = df1.columns.union(df2.columns)

# 重索引并填充0
df1_aligned = df1.reindex(index=all_rows, columns=all_cols, fill_value=0)
df2_aligned = df2.reindex(index=all_rows, columns=all_cols, fill_value=0)

# 执行减法
result = df2_aligned - df1_aligned
print(result)

运行后得到的结果就是你期望的:

A  B  C  D  E
ZA   3  4  1  0 -1
ZB   4 -4  4  6 -1
ZC  -1 -5  0 -1  0
ZD   0  9  5  3  0

原理说明

  • index.union()和columns.union()用来获取两个DataFrame行/列的所有索引(包括各自独有的部分);
  • reindex()会根据新的索引重新排列数据,缺失的位置用fill_value=0填充,这样就保证了两个DataFrame的行和列完全一致;
  • 此时再做减法,所有位置都能基于0参与计算,完美匹配你的需求。

不管是对比不同日期范围的客户-产品数据,还是其他双维度索引不一致的场景,这个方法都通用——只要确保先对齐索引并填充0,就能得到你想要的逐元素减法结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:33:13