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

如何基于指定列优先级,利用非缺失值生成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]

原理说明

  1. df[cols_pref_inorder]:按优先级从高到低筛选出目标列
  2. bfill(axis=1):对每行的缺失值,用右侧(低一级优先级)列的非缺失值填充,这样第一列(最高优先级)会被填充为该行第一个非缺失值
  3. 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)

原代码问题修正

你之前的代码存在两个问题:

  1. 函数内使用了全局的df["product5"]而非当前行的x["product5"],导致无法正确逐行判断
  2. 逻辑不通用,新增优先级列时需要修改函数条件

修正后的原逻辑代码(非通用版):

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:52:24