在多列和 return 匹配的列标题中查找匹配值

look for match values in multiple columns and return the matched column head

我正在尝试检查哪一列(3 列)在第 min 列和 return 匹配列的列标题中包含相同的值。我可以用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 变为 0True 变为 1。当我使用 ddcolumns 作为另一个操作数时,点积的求和方面会自动连接匹配的列中的字符串。

dd.eq(df['min'], 0).dot(dd.columns)

0     A
1     C
2    AB
dtype: object

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

这是一个班轮。

In [138]: (df[list('ABC')].eq(df['min'], axis=0)
           .apply(lambda x: ''.join(x[x].index), axis=1))
Out[138]:
0      A
1      C
2    AB
dtype: object

In [139]: df['which_col'] = (df[list('ABC')].eq(df['min'], axis=0)
                             .apply(lambda x: ''.join(x[x].index), axis=1))

In [140]: df
Out[140]:
   A  B  C  min which_col
0  1  2  3    1         A
1  2  3  6    6         C
2  2  2  1    2        AB