写入并读取DataFrame后Y变量方差变化,R²差异达10%技术求助
问题排查与解决方案
可能的原因
- 数据类型隐式转换:拼接后的DataFrame中Y变量可能是
float32或object等非标准类型,保存为CSV再读取时会被强制转为float64,消除了类型不一致导致的计算偏差。可通过对比前后Y列的dtype验证。 - 异常值与索引问题:拼接过程中可能引入重复索引、隐藏的
NaN/inf值,CSV保存读取时会自动处理这类异常(比如将inf转为NaN),模型拟合时对NaN的自动丢弃会改变数据集分布,进而影响方差和R²。 - 拼接对齐误差:多DataFrame拼接时若列名/索引未严格对齐,可能导致部分数据错位填充为
NaN,但np.allclose因默认忽略NaN或容差设置无法检测到这类差异。 - 内存优化的隐性影响:百万行级DataFrame可能触发pandas内存优化(如将
float64转float32),虽np.allclose能通过,但大量微小误差累积会改变方差计算结果,最终影响R²。
验证与修复步骤
检查数据类型
print("原Y列类型:", df['Y'].dtype) print("读取后Y列类型:", df_new['Y'].dtype)若类型不一致,手动转换为
float64:df['Y'] = df['Y'].astype('float64')直接对比数据差异
diff = df.compare(df_new, keep_shape=True, keep_equal=False) print(diff)重点查看Y列差异行,定位异常值或错位数据。
排查索引与异常值
import numpy as np print("重复索引数:", df.index.duplicated().sum()) print("原Y列NaN数:", df['Y'].isna().sum()) print("读取后Y列NaN数:", df_new['Y'].isna().sum()) print("原Y列inf数:", df['Y'].isin([np.inf, -np.inf]).sum())处理重复索引:
df = df.reset_index(drop=True);处理inf:df['Y'] = df['Y'].replace([np.inf, -np.inf], np.nan).dropna()强制指定拼接数据类型
避免自动内存优化导致的类型转换:df_combined = pd.concat([df1, df2, ...], dtype={'Y': 'float64'})
内容的提问来源于stack exchange,提问作者Aaron Smith
相关产品推荐
相关产品推荐

