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

