Python Pandas中同浮点列逐行相除为何返回NaN?
问题原因及解决方法
原因分析
核心问题是行索引不匹配:
- 筛选
A='a'得到的df1保留了原DataFrame的行索引0,筛选A='b'得到的df2保留了原行索引1。 - pandas的
div()方法默认会按索引(行/列)对齐进行计算,当两个DataFrame的行索引没有重叠时,对应位置无法匹配,计算结果就会全部生成NaN。
你可以通过打印索引验证这一点:
print(df1.index) # 输出: Int64Index([0], dtype='int64') print(df2.index) # 输出: Int64Index([1], dtype='int64')
解决方法
以下是几种可行的解决方式:
方法1:重置索引对齐
重置两个DataFrame的行索引,让它们的索引一致后再计算:
import pandas as pd ddd = { 'A': ['a', 'b'], 'X': [100.0, 20.0], 'Y': [6.0, 2.0] } df = pd.DataFrame(ddd) df1 = df[df['A'] == 'a'].reset_index(drop=True) df2 = df[df['A'] == 'b'].reset_index(drop=True) res = df1.iloc[:, 1:].div(df2.iloc[:, 1:], axis=0) print(res) # 输出: # X Y # 0 5.0 3.0
方法2:提取为Series计算
由于每个筛选结果只有一行,直接提取为Series后做除法(Series的索引是列名,天然对齐):
s1 = df[df['A'] == 'a'].iloc[0, 1:] s2 = df[df['A'] == 'b'].iloc[0, 1:] res = s1.div(s2) print(res) # 输出: # X 5.0 # Y 3.0 # Name: 0, dtype: float64
方法3:直接使用数值数组计算
绕过pandas的索引对齐机制,直接提取底层数值数组进行除法:
res = df1.iloc[:, 1:].values / df2.iloc[:, 1:].values print(pd.DataFrame(res, columns=['X', 'Y'])) # 输出: # X Y # 0 5.0 3.0
内容的提问来源于stack exchange,提问作者user3440012
相关产品推荐
相关产品推荐

