在多列中查找匹配值并返回匹配的列标题

时间:2017-07-21 19:14:27

标签: python pandas match multiple-columns

我试图检查哪个列(在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')....)

谢谢!

2 个答案:

答案 0 :(得分:4)

我建议的解决方案

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。当我使用columns dd作为另一个操作数时,点积的总和方面会自动连接列中匹配的字符串。

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

0     A
1     C
2    AB
dtype: object

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

答案 1 :(得分:1)

这是一个班轮。

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
相关问题