列名相同索引不同的DataFrame相减出现NaN的问题求助
解决列名相同但索引不同的DataFrame相减NaN问题
嘿,这个问题我之前也碰到过!核心原因是Pandas的算术运算默认会严格按照索引对齐来执行,只要两个DataFrame的索引不匹配,对应的位置就会返回NaN——这就是你各种尝试都出NaN的根源。下面给你几个可行的解决方案:
方法1:重置索引后再相减
把两个DataFrame的索引都重置为默认的整数索引,这样Pandas就会按行的位置(而不是索引标签)来对应相减:
# 重置索引并丢弃原索引,确保行位置对齐 result = df1.reset_index(drop=True) - df2.reset_index(drop=True)
方法2:直接提取值跳过索引对齐
如果不需要保留原索引的对齐逻辑,可以直接提取DataFrame的数值数组(numpy数组)来运算,这样Pandas会忽略索引,只按列和行的位置对应:
# 用.values或.to_numpy()提取数值数组 result = df1 - df2.values # 或者 result = df1 - df2.to_numpy()
方法3:使用sub方法指定按列对齐
Pandas的sub方法支持通过axis参数指定对齐方式,设置axis='columns'就能强制按列名匹配,忽略索引的差异:
# 指定按列对齐,而非默认的行(索引)对齐 result = df1.sub(df2, axis='columns')
为什么你之前的尝试没效果?
df1.ix['Norm']-df2.ix['Norm']:这里你是提取了两个DataFrame中索引为Norm的行,然后按行的索引(如果这行还有多级索引的话)对齐,自然会因为索引不匹配出NaN;df1 - df2.ix['Norm']:这是用一个单行Series和整个DataFrame运算,维度不匹配,结果必然是NaN;astype(float):只是转换了数据类型,根本没解决索引对齐的核心问题,所以还是会得到NaN。
示例验证
给你个小例子直观感受下效果:
import pandas as pd # 构造测试用DataFrame df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}, index=['x','y','z']) df2 = pd.DataFrame({'A': [10,20,30], 'B': [40,50,60]}, index=['a','b','c']) # 用方法1得到的结果 print(df1.reset_index(drop=True) - df2.reset_index(drop=True)) # 输出: # A B # 0 -9 -36 # 1 -18 -45 # 2 -27 -54
内容的提问来源于stack exchange,提问作者hammies
相关产品推荐
相关产品推荐

