熊猫-检查哪一列与另一列匹配-不是布尔值

时间:2018-09-17 18:59:44

标签: python pandas

我在熊猫中有以下数据框:

target     A       B      C
0 cat      bridge  cat    brush
1 brush    dog     cat    shoe
2 bridge   cat     shoe   bridge 

所需的输出:

  target   A       B      C       D
0 cat      bridge  cat    brush   B
1 brush    dog     cat    shoe    None
2 bridge   cat     shoe   bridge  C

我需要知道哪一列与我的目标列匹配(列D)。我已经看过以前的帖子43093394,但我不足以知道列是否匹配,我需要知道哪个列匹配哪个目标,以及是否不匹配。相同的问题在此处发布了40320476,但在sql中却没有帮助。

期待您的输入,谢谢!

3 个答案:

答案 0 :(得分:4)

eqdot一起使用

df.loc[:,'A':].eq(df.target,0).dot(df.columns[1:])
Out[466]: 
0    B
1     
2    C
dtype: object
#df['D']=df.loc[:,'A':].eq(df.target,0).dot(df.columns[1:])

答案 1 :(得分:2)

这些解决方案将返回匹配的第一列。

idxmax

m = df.drop('target', 1).eq(df.target, axis=0)
df.assign(D=m.idxmax(1).where(m.any(1)))

   target       A     B       C    D
0     cat  bridge   cat   brush    B
1   brush     dog   cat    shoe  NaN
2  bridge     cat  shoe  bridge    C

np.where

t = df.target.values[:, None]
v = df.drop('target', 1)
m = t == v.values

i = np.where(m.any(1), v.columns[m.argmax(1)], np.nan)

df.assign(D=i)

   target       A     B       C    D
0     cat  bridge   cat   brush    B
1   brush     dog   cat    shoe  NaN
2  bridge     cat  shoe  bridge    C

答案 2 :(得分:1)

为使您有一个基本的了解,我在下面做了一些说明,但是我建议您使用其他专家的答案,因为它们更通用。

df = pd.DataFrame([['cat', 'bridge','cat','brush'], ['brush','dog','cat','shoe'], ['bridge','cat','shoe','bridge' ]], columns=['target','A', 'B','C'])
mapper = {0:'A',1:'B',2:'C'}
func = lambda x : mappr[[x['A'],x['B'],x['C']].index(x['target'])] if x['target'] in [x['A'],x['B'],x['C']] else np.nan
df['D'] = df.apply(func, axis=1)
df

输出

   target   A   B   C   D
0   cat bridge  cat brush   B
1   brush   dog cat shoe    NaN
2   bridge  cat shoe    bridge  C