我试图检查哪一列(3列)在column中包含相同的值min
,并返回match列的列标题。我可以使用进行操作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
I的每一行进行比较,我需要将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
ofdd
用作另一个操作数时,点积的sum方面会自动将存在匹配项的列中的字符串连接起来。
dd.eq(df['min'], 0).dot(dd.columns)
0 A
1 C
2 AB
dtype: object
最后,我使用包含结果的新列assign
创建的新副本df
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句