Skip to main content
 首页 » 编程设计

python之在多列中查找匹配值并返回匹配的列头

2025年05月04日25sky-heaven

我正在尝试检查哪一列(在 3 列中)在 min 列中包含相同的值,并返回匹配列的列标题。我可以用np.where来完成,然后我需要手动输入条件并比较列,这样做是否更优雅?

输入示例:

 A    B   C   min     
 1    2   3   1       
 2    3   6   6       
 2    2   1   2       

输出示例:

 A    B   C   min    which_col 
 1    2   3   1      A 
 2    3   6   6      C 
 2    2   1   2      AB 

我可以使用:

np.where(df['min']==df['A'], 'A', np.where(df['min']==df['B'], 'B')....) 

谢谢!

请您参考如下方法:

我提出的解决方案

dd = df.drop('min', 1) 
df.assign(which_col=dd.eq(df['min'], 0).dot(dd.columns)) 
 
   A  B  C  min which_col 
0  1  2  3    1         A 
1  2  3  6    6         C 
2  2  2  1    2        AB 

解释

我首先分配一个临时数据帧 dd,其中所有列减去 'min' 列。我本可以将所有内容放在一行中,但我相信这有助于提高可读性。

dd = df.drop('min', 1) 

接下来,我将 'min' 列与 dd 进行比较。但是为了将 df['min'] 的每个元素与 dd 的每一行进行比较,我需要将 axis=0 参数传递给eq 方法

dd.eq(df['min'], 0) 
 
       A      B      C 
0   True  False  False 
1  False  False   True 
2   True   True  False 

如果我在点积中使用这个结果,它会自动转换为 int,因此 False 变成 0 而 True 变成 1。当我使用 dd 的 columns 作为另一个操作数时,点积的求和方面会自动连接匹配的列中的字符串。

dd.eq(df['min'], 0).dot(dd.columns) 
 
0     A 
1     C 
2    AB 
dtype: object 

最后,我使用 assign 创建一个新的 df 副本,其中包含一个包含结果的新列。