如何在Pandas中匹配多列并将匹配值转为单个新列?
实现方法拆解
嘿,这个需求其实挺常见的,我给你分享几种实用的Pandas实现方式,你可以根据自己的习惯选:
方法1:用apply遍历行找匹配值
这种方式比较直观,针对每一行遍历目标列,提取出等于'21'的值:
# 先定义目标列(你这里是col2、col3、col4) target_cols = ['col2', 'col3', 'col4'] # 新增matched_value列,提取匹配到的21 df1['matched_value'] = df1[target_cols].apply( lambda row: next((val for val in row if val == '21'), None), axis=1 )
因为你已经提前筛选出了包含'21'的行,所以next总能找到值,不会返回None,放心用就行。
方法2:用mask+填充函数快速提取
这种方法更高效,适合数据量较大的情况:
df1['matched_value'] = df1[target_cols].mask(df1[target_cols] != '21').bfill(axis=1).iloc[:, 0]
原理是:先用mask把所有不等于'21'的单元格转为NaN,然后用bfill(axis=1)按行从右往左填充NaN(也可以用ffill(axis=1)从左往右),最后取每一行的第一个有效值,就是我们要的'21'。
方法3:链式np.where判断(适合列数少的场景)
如果你的目标列只有3列,用这种方式可读性很高:
import numpy as np df1['matched_value'] = np.where(df1['col2'] == '21', df1['col2'], np.where(df1['col3'] == '21', df1['col3'], df1['col4']))
逻辑很简单:先判断col2是不是21,是就取col2的值;不是就判断col3,以此类推,最后取到匹配的那个值。
内容的提问来源于stack exchange,提问作者Conquest
相关产品推荐
相关产品推荐

