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

