我有两个数据帧df1
和df2
。我想将new_id
中的值放在df1
中的列df2
中。
s = {'id': [4735,46,2345,8768,807,7896],
'st': ['a', 'a', 'd', 'e', 'f', 'a'],
'rd' : ['CU', 'SU', 'NU', 'NU', 'W', 'CU'],
'cm' : ['m', 'm', 'm', 'm', 'm','m']}
df1 = pd.DataFrame(s)
df1
id st rd cm
0 4735 a CU m
1 46 a SU m
2 2345 d NU m
3 8768 e NU m
4 807 f W m
5 7896 a CU m
s2 = {'id': [1234,4567,1357,2367,8765, 8796, 5687, 4565, 7865],
'st': ['a', 'a', 'd', 'd', 'f', 'f','e' ,'e','a'],
'rd' : ['CU', 'SU', 'NU', 'W', 'W','NU','W','CU','W'],
'cm' : ['s', 's', 's', 's', 's','s','s','s','s']}
df2 = pd.DataFrame(s2)
df2
id st rd cm
0 1234 a CU s
1 4567 a SU s
2 1357 d NU s
3 2367 d W s
4 8765 f W s
5 8796 f NU s
6 5687 e W s
7 4565 e CU s
8 7865 a W s
我希望将new_id
的值与{{1}相同的df1
中的值放在id
的{{1}}列的df2
中}}值应该不同。
,并且一旦从df2中选择了一个值,就不应再次使用该值。我怎么在熊猫里做
我期待结果:
st
答案 0 :(得分:4)
使用np.equal.outer
比较来获得此跨数据帧匹配,并使用np.argmax
来检索索引。
comp = np.equal.outer(df1.st, df2.st) & ~np.equal.outer(df1.rd, df2.rd)
df1['new_id'] = df2.id[np.argmax(comp, axis=1)].tolist()
id st rd cm new_id
0 4735 a CU m 4567
1 46 a SU m 1234
2 2345 d NU m 2367
3 8768 e NU m 5687
4 807 f W m 8796
答案 1 :(得分:0)
怎么样?
df3 = df2.copy()
def cond(row):
cond = ((df3['st'] == row['st']) & (df3['rd'] != row['rd']))
tmp = df3.loc[cond, 'id']
val = tmp.iloc[0]
idx = tmp[tmp == val].index[0]
df3.drop(idx, inplace=True)
return val
df1.assign(new_id=df1.apply(cond, axis=1))
id st rd cm new_id
0 4735 a CU m 4567
1 46 a SU m 1234
2 2345 d NU m 2367
3 8768 e NU m 5687
4 807 f W m 8796
5 7896 a CU m 7865