我试图检查哪个列(在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')....)
谢谢!
答案 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
变为0
而True
变为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