我正在尝试检查哪一列(在 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 副本,其中包含一个包含结果的新列。
