如何对行、列索引均不同的两个Pandas DataFrame执行减法运算?
解决DataFrame行/列索引不一致时的减法需求
你遇到的问题是pandas默认的sub()方法只会在两个DataFrame共同的行和列索引上执行运算,缺失的位置会返回NaN,但你需要把缺失的行/列视为0来参与计算。不管是单轴还是双轴(行+列)索引不一致的情况,都可以通过先对齐索引并填充缺失值为0的方式解决。
具体实现步骤
- 获取两个DataFrame的行索引并集和列索引并集;
- 用这两个并集分别对df1和df2进行重索引,缺失值填充为0;
- 对重索引后的两个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
相关产品推荐
相关产品推荐

