如何高效从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
相关产品推荐
相关产品推荐

