使用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
相关产品推荐
相关产品推荐

