为何DataFrame索引相同时按列除法仍返回全NaN值?
为什么df.div(df['D'], axis=1)返回全NaN,而axis=0正常?
问题核心是对div方法的axis参数及Pandas对齐逻辑的理解偏差:
df['D']是行索引为0、1、2的Series,它没有列标签。- 当设置
axis=1时,div会按列标签对齐:DataFrame的列是A、B、C、D,而Series的索引是0、1、2,两者没有匹配的列标签,所有位置都无法完成对齐计算,结果全为NaN,同时Series的索引会被当作新列添加到结果里(就是你看到的0、1、2列)。 - 当设置
axis=0时,div按行索引对齐:DataFrame和Series的行索引完全一致(0、1、2),每一行的元素都能和对应行的D值完成除法运算,得到预期结果。
另外注意,你写的df.astype(float)没有赋值,不会改变原DataFrame的类型,应该改成df = df.astype(float)(不过这不是导致NaN的原因)。
如果你想实现「每列元素除以对应行的D列值」,正确写法就是你用到的axis=0,也可以用更直接的广播写法:
result = df / df['D'].values[:, None]
你的测试代码及结果:
data = {'A': [2, 3, 4], 'B': [10, 20, 30], 'C': [5, 4, 1], 'D': [1, 1, 1]} # 创建DataFrame df = pd.DataFrame(data) df = df.astype(float) # 修正:添加赋值操作 # 每列除以D列 result_col = df.div(df['D'], axis=1) result_row = df.div(df['D'], axis=0) print(result_col) print(result_row)
运行结果:
A B C D 0 1 2 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN
A B C D 0 2.0 10.0 5.0 1.0 1 3.0 20.0 4.0 1.0 2 4.0 30.0 1.0 1.0
内容的提问来源于stack exchange,提问作者macarena
相关产品推荐
相关产品推荐

