Pandas如何移除NaN并将多列剩余有效值合并为单列
多列NaN值合并为有效值单列的高效实现
你可以根据实际场景选择下面两种通用实现,无需手动枚举所有待合并列,适配列数较多的场景:
方法1:利用stack()自动丢弃空值(推荐,适合每行仅1个有效值的场景)
stack()操作会自动将行转列并丢弃NaN值,刚好适配你给出的示例场景,代码如下:
# 筛选所有待合并的列,这里以列名包含Set_为例,你可以根据实际规则调整筛选逻辑 merge_cols = df.filter(like="Set_").columns # 合并生成新列,reset_index保证行对应关系不变 df["Set"] = df[merge_cols].stack().reset_index(drop=True) # 提取最终需要的结果 result = df[["Name", "Set"]]
提示:如果存在全行待合并列均为NaN的情况,可将
stack()行修改为df[merge_cols].stack().reindex(df.index),避免行索引错位。
方法2:逐行提取非空值(适合每行可能存在多个有效值、需自定义取值逻辑的场景)
如果你需要对每行的多个有效值做自定义处理(比如取第一个/最后一个,或拼接所有有效值),可以用apply逐行处理:
merge_cols = df.filter(like="Set_").columns # 示例为取每行第一个非空值,如需拼接可改为 lambda x: '/'.join(x.dropna()) df["Set"] = df[merge_cols].apply(lambda row: row.dropna().iloc[0], axis=1) result = df[["Name", "Set"]]
注意事项
你原有代码中的df['Set_1'] != 'NaN'是错误写法:pandas中的空值为np.nan,属于浮点数类型,不能直接用等于/不等于判断,需用pd.isna()或pd.notna()做空值校验。
内容的提问来源于stack exchange,提问作者ka4c
相关产品推荐
相关产品推荐

