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

如何高效从Pandas DataFrame多列中按规则提取值到新列

高效实现Pandas按行取最右侧符合条件的值填充列

直接用Pandas的向量化操作就能搞定,完全不用逐列循环判断,效率拉满,两种方案供你选:

方案一:通过填充NaN取最右侧有效值

先筛选出val1到val5中符合code_list的值,不符合的转为NaN,再按行从右往左填充(bfill),取每行第一个非NaN值就是最右侧符合条件的结果:

import pandas as pd

# 示例DataFrame(替换成你的实际数据)
df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02'],
    'id': [1, 2],
    'val1': ['349C', 'XXX'],
    'val2': ['YYY', '303F'],
    'val3': ['303F', 'ZZZ'],
    'val4': ['XXX', '497C'],
    'val5': ['201D', 'XXX'],
    'val_final': ['', '']
})

code_list = ['349C', '303F', '201D', '497C']
val_cols = ['val1', 'val2', 'val3', 'val4', 'val5']

# 核心步骤
filtered_cols = df[val_cols].where(df[val_cols].isin(code_list))
df['val_final'] = filtered_cols.bfill(axis=1).iloc[:, 0]

方案二:通过索引匹配取最右侧值

先标记每行各列是否符合条件,反转列顺序后找到第一个符合条件的列(也就是原顺序最右侧的),再通过索引匹配取值:

mask = df[val_cols].isin(code_list)
# 反转列顺序找第一个True的列,对应原顺序最右侧符合条件的列
rightmost_col = mask.loc[:, ::-1].idxmax(axis=1)
# 按索引匹配值
df['val_final'] = df.lookup(df.index, rightmost_col)

为什么这两种方法高效?

这两种都是向量化操作,Pandas底层用C优化过,比你写for循环逐列判断快几个数量级,尤其是数据量上万甚至几十万行的时候,差距会非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:22:16