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

使用Pandas subtract出现NaNs:DataFrame相减pd.sub失效求助

解决DataFrame减法(pd.sub)无法正常工作的问题

你的问题核心在于两个DataFrame的列名不匹配,导致pandas在执行减法时无法正确对齐数据,最终得到的结果全是NaN。下面详细说明原因和解决方案:

问题根源

pandas的算术运算(包括sub)默认会同时对齐行索引和列名:

  • stock_returns的列名是['A', 'B', 'C']
  • p_df的列名是默认的[0]

因为没有匹配的列名,即使你指定了axis=0(按行索引对齐),pandas也找不到对应列的数值来做减法,所以结果全部为NaN。

解决方案

方案1:将p_df转换为Series(推荐)

把单列的DataFrame转为Series后,pandas会自动按行索引对齐,并对stock_returns的每一列广播执行减法:

import pandas as pd

stock_returns = pd.DataFrame([[10,100,200], [15, 115, 215], [20,120, 220], [25,125,225], [30,130,230]], columns=['A', 'B', 'C'])
p_df = pd.DataFrame([1,2,3,4,5])

# 将p_df转为Series,squeeze()会自动压缩单列为Series
result = stock_returns.sub(p_df.squeeze(), axis=0)
print(result)

输出结果:

A    B    C
0   9   99  199
1  13  113  213
2  17  117  217
3  21  121  221
4  26  126  226

方案2:统一两个DataFrame的列名

如果想保持DataFrame的结构,可以把p_df的列名修改为和stock_returns一致,这样pandas就能正确匹配列执行减法:

import pandas as pd

stock_returns = pd.DataFrame([[10,100,200], [15, 115, 215], [20,120, 220], [25,125,225], [30,130,230]], columns=['A', 'B', 'C'])
p_df = pd.DataFrame([1,2,3,4,5])

# 修改p_df的列名匹配stock_returns
p_df.columns = stock_returns.columns
result = stock_returns.sub(p_df, axis=0)
print(result)

这个方案的输出和方案1完全一致。

补充说明

如果你之前尝试过fill_value参数但没用,是因为fill_value是用来填充缺失的行/列索引的,而你的问题是列名完全不匹配,根本没有可对齐的列,所以这个参数无法解决问题。

内容的提问来源于stack exchange,提问作者MANGo 92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:41:34