Python执行减法运算时出现大量NaN值的解决方法
问题原因与解决方法
导致X3出现大量NaN的核心原因有3个:
- X1、X2的
Mar列本身存在缺失值,参与计算时会传播为NaN - 两个数据集筛选1984-2020年之后索引未对齐,Series按索引匹配运算时不匹配的位置会生成NaN
- 原代码中用
pd.DataFrame()二次构造数据时,如果原csv列名不匹配,会生成空列导致后续取值为NaN
具体修复步骤
- 优化数据读取逻辑,避免构造空列
读文件时直接用usecols指定需要的列,不需要二次构造DataFrame,同时重置索引保证两个数据集行严格按年份对齐:
import pandas as pd from sklearn import linear_model import numpy as np # 读取X1 X1 = pd.read_csv(r'file\X1.csv', usecols=['Year','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']) X1 = X1[X1['Year'].between(1984,2020, inclusive="both")].reset_index(drop=True) # 读取X2 X2 = pd.read_csv(r'file\X2.csv', usecols=['Year','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']) X2 = X2[X2['Year'].between(1984,2020, inclusive="both")].reset_index(drop=True)
- 清洗缺失值,对齐两个序列
提取Mar列后合并检查,统一删除存在缺失的行:
# 提取3月数据并合并去空 mar_data = pd.concat([X1['Mar'], X2['Mar']], axis=1, keys=['X1_mar', 'X2_mar']).dropna() X1_mar = mar_data['X1_mar'] X2_mar = mar_data['X2_mar']
- 执行回归与去趋势计算
regr = linear_model.LinearRegression() regr.fit(X1_mar.values.reshape(-1,1), X2_mar) # 计算趋势线,coef_取第一个元素避免数组广播问题 trend = regr.coef_[0] * X1_mar + regr.intercept_ X3 = X2_mar - trend # 可选:如果仍有少量空值可删除或填充 # X3 = X3.dropna() # X3 = X3.fillna(X3.mean()) print(X3)
内容的提问来源于stack exchange,提问作者user2543
相关产品推荐
相关产品推荐

