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

Pandas中pd.concat合并后新列全为NaN问题求助

问题根源:索引不匹配导致合并后全为NaN

我一眼就看到问题所在了——索引不匹配!看你给出的输出就能发现:combo.iloc[4]的行索引是4,但zscores.iloc[4]的行索引却是5!这直接导致pd.concat按索引对齐合并时,combo里的行在zscores中找不到对应项,只能填充NaN。

为什么会出现这个情况?

你的代码里这一步是关键问题:

zscores = combos.loc[:,pa_grade_cols].dropna(axis=0)

dropna(axis=0)直接删除了所有包含NaN的行(比如combo行4里的pa grade PA09是NaN,整行就被删掉了),导致zscores的行数比combo少,而且索引是原combo中无NaN行的索引,和原数据的索引序列完全断裂。

正确的解决方案:保留原索引,计算时忽略NaN

不需要删除任何行,而是在计算z-score时直接跳过NaN值,同时保留原数据的索引,这样就能和原combo完美匹配。

方法1:直接给combo添加新列(最简洁)

from scipy.stats import zscore

# 遍历目标列,计算z-score并添加为新列
for col in pa_grade_cols:
    combo[f"zscore {col}"] = zscore(combo[col], nan_policy="omit")

方法2:生成zscores后用join合并(更灵活)

from scipy.stats import zscore

# 对目标列计算z-score,忽略NaN,保留原索引
zscores = combo[pa_grade_cols].apply(lambda x: zscore(x, nan_policy="omit"))
# 重命名列名
zscores = zscores.rename(lambda x: f"zscore {x}", axis=1)
# 用join按索引合并(默认按索引对齐,比concat更安全)
newcombo = combo.join(zscores)

验证效果

这样处理后,newcombo里的行4会正确匹配到对应的z-score值,只有原本是NaN的列(比如pa grade PA09)对应的z-score才会是NaN,其他列都会显示正确的计算结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:35:09