我在熊猫中有以下数据框:
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中却没有帮助。
期待您的输入,谢谢!
答案 0 :(得分:4)
将eq
与dot
一起使用
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