合并DataFrame两列生成第三列时触发ValueError错误求助
嘿,这个问题我之前也碰到过,我来给你拆解一下原因和解决办法:
问题出在哪?
你用的merger.stack().values之所以报错,核心原因是Pandas的stack()方法默认会自动丢弃所有包含NaN的元素。看你的数据里第954行,Type_x和Type_y都是NaN,这一行在执行stack()之后会被直接剔除,导致stack().values的长度比原DataFrame的行数少了(少了那些两列全为NaN的行),自然就触发了「长度不匹配」的错误。
哪怕你把NaN换成0,只要某一行两列都是0,stack()虽然会保留,但这反而不符合你想要提取有效非空值的期望对吧?
解决办法(三种可选,按需选择)
方法1:横向填充法(最简洁)
因为你的数据每一行最多只有一个非NaN值,我们可以用横向填充的方式直接提取目标值:
merger['Type'] = merger[['Type_x', 'Type_y']].bfill(axis=1).iloc[:, 0]
bfill(axis=1)会从右往左把非NaN值填充到该行的NaN位置,之后取第一列就得到了每一行的有效非空值;如果你的非NaN值偶尔会出现在左边,换成ffill(axis=1)(从左往右填充)效果完全一样,全NaN的行最终还是NaN,完美匹配你的期望。
方法2:基于stack的补全法
如果你一定要用stack()的思路,可以先保留索引,再补全缺失的行:
# 先堆叠,再按行分组取第一个非空值,最后对齐原索引补全NaN stacked_series = merger[['Type_x', 'Type_y']].stack().groupby(level=0).first() merger['Type'] = stacked_series.reindex(merger.index)
groupby(level=0).first()是取每一行的第一个非NaN值,reindex(merger.index)会把原DataFrame中那些被stack丢弃的全NaN行补回来,默认填充NaN,这样长度就完全匹配了。
方法3:条件判断法(最直观)
用numpy.where直接做条件判断,逻辑清晰易懂:
import numpy as np merger['Type'] = np.where(merger['Type_x'].notna(), merger['Type_x'], merger['Type_y'])
逻辑很简单:如果Type_x不是NaN就取它的值,否则取Type_y的值;如果两行都是NaN,结果自然就是NaN,完全符合你的需求。
内容的提问来源于stack exchange,提问作者David

