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

Python pandas如何合并多个同语义列提取每行非空值为单列

pandas 合并多列同语义非空值实现方法

针对每行仅在多个同名列中存在一个非空值的场景,不需要写逐行判断的条件语句,直接用pandas内置的矢量化方法即可快速实现。

核心实现

通过按行向后填充(bfill)的逻辑,把每行靠后列的非空值填充到前面列的空值位置,取填充后的第一列结果就是整合好的有效值,最后删除多余列即可:

# 跨三个教育相关列按行取非空值,写入education列
df['education'] = df[['education', 'education_2', 'education_3']].bfill(axis=1).iloc[:, 0]
# 保留需要的列
result = df[['name', 'education']]

这个方法是pandas原生矢量化实现,性能远高于逐行循环、apply自定义判断的方案,数据量越大优势越明显。

完整复现代码

import pandas as pd
import numpy as np

# 构造原始示例数据
df = pd.DataFrame({
    'name': ['name_1', 'name_2', 'name_3'],
    'education': [np.nan, np.nan, 'high school'],
    'education_2': ['some college', np.nan, np.nan],
    'education_3': [np.nan, 'graduate degree', np.nan]
})

# 执行合并逻辑
df['education'] = df[['education', 'education_2', 'education_3']].bfill(axis=1).iloc[:, 0]
result = df[['name', 'education']]

print(result)

运行输出完全匹配预期结果:

name        education
0  name_1     some college
1  name_2  graduate degree
2  name_3      high school

可选替代方案

如果使用的pandas版本在1.3.0及以上,也可以通过combine_first链式调用实现,效果一致:

df['education'] = df['education'].combine_first(df['education_2']).combine_first(df['education_3'])
result = df[['name', 'education']]

补充说明:如果某行三个教育列全为空值,上述两种方法都会保留NaN,如需设置默认值可以在最后拼接.fillna('你的默认填充值')即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:06:51