如何基于指定列优先级,利用非缺失值生成Pandas新列?
基于指定优先级列生成非缺失值优先的新列
需求说明
需要根据给定的列优先级列表(优先级从高到低)生成新列:新列优先取高优先级列的非缺失值;若高优先级列值为NaN,则依次取下一级列的非缺失值,要求方案支持任意数量的列。
示例输入:
import pandas as pd import numpy as np df = pd.DataFrame({ "product": ["apple", "banan"], "product2": ["Appl", "Banan"], "product5": ["Apple", np.nan] })
优先级列表:
cols_pref_inorder = ["product5", "product2", "product"]
期望输出:
product product2 product5 Product_final 0 apple Appl Apple Apple # 优先使用product5的非缺失值 1 banan Banan NaN Banan # product5为NaN,使用下一级product2的值
最优解决方案(向量化操作,高效通用)
Pandas内置的bfill(axis=1)方法可实现按行向后填充缺失值,结合列优先级顺序,直接提取第一列即可得到目标结果:
# 按优先级顺序选取列,向后填充缺失值,取第一列作为最终结果 df["Product_final"] = df[cols_pref_inorder].bfill(axis=1).iloc[:, 0]
原理说明
df[cols_pref_inorder]:按优先级从高到低筛选出目标列bfill(axis=1):对每行的缺失值,用右侧(低一级优先级)列的非缺失值填充,这样第一列(最高优先级)会被填充为该行第一个非缺失值iloc[:, 0]:提取填充后的第一列,即为我们需要的优先非缺失值列
该方法是向量化操作,比逐行处理的apply效率高得多,尤其适合大数据量场景,且完全通用——无论优先级列表有多少列,只需传入列表即可。
替代方案(基于apply,适合小数据量)
如果一定要用apply实现,可通过遍历优先级列表实现通用逻辑:
def get_priority_value(x): for col in cols_pref_inorder: if pd.notnull(x[col]): return x[col] return np.nan # 所有列均为缺失值时返回NaN df["Product_final"] = df.apply(get_priority_value, axis=1)
原代码问题修正
你之前的代码存在两个问题:
- 函数内使用了全局的
df["product5"]而非当前行的x["product5"],导致无法正确逐行判断 - 逻辑不通用,新增优先级列时需要修改函数条件
修正后的原逻辑代码(非通用版):
def create(x): if pd.notnull(x["product5"]): return x["product5"] elif pd.notnull(x["product2"]): return x["product2"] else: return x["product"] df["Product_final"] = df.apply(create, axis=1)
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

