在多列和 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
变为 0
,True
变为 1
。当我使用 dd
的 columns
作为另一个操作数时,点积的求和方面会自动连接匹配的列中的字符串。
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
我正在尝试检查哪一列(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
变为 0
,True
变为 1
。当我使用 dd
的 columns
作为另一个操作数时,点积的求和方面会自动连接匹配的列中的字符串。
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