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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:32:32