我有两个数据帧:Users and Item_map
。
Users
由存储在三列中的user and fake_item_ids
组成。
Item_map
由real_item_ids and fake_item_ids
组成。
我要用fake_item_ids
替换所有real_item_ids
。
用伪代码进行说明:
DataFrame Users
user fake_0 fake_1
0 1 6786 3938
1 2 6786 6786
2 3 4345 4345
3 4 7987 3938
4 5 7987 5464
DataFrame Item_map
real_id fake_id
0 101 7987
1 202 6786
2 303 5464
3 404 4345
4 505 3938
预期结果:
DataFrame Users
user real_0 real_1
0 1 202 505
1 2 202 202
2 3 404 404
3 4 101 505
4 5 101 303
根据此处找到的答案,我尝试了以下操作:how to concat two data frames with different column names in pandas? - python
users['fake_0'] = users.merge(items.rename(columns={'fake_id': 'fake_0'}), how='inner')['real_id']
导致以下结果:
user fake_0 fake_1
0 1 202 3938
1 2 202 6786
2 3 404 4345
3 4 101 3938
4 5 101 5464
这行得通,但是对每个列单独这样做似乎很愚蠢(我有9个列的fake_id必须是real_ids)。
非常感谢您的帮助!
虚拟代码:
users = pd.DataFrame({
'user': [1, 2, 3, 4, 5],
'fake_0': [6786, 6786, 4345, 7987, 7987],
'fake_1': [3938, 6786, 4345, 3938, 5464]
})
item_map = pd.DataFrame({
'real_id': [101, 202, 303, 404, 505],
'fake_id': [7987, 6786, 5464, 4345, 3938]
})
答案 0 :(得分:1)
我们使用replace
df.replace(dict(zip(df1.fake_id,df1.real_id)))
Out[46]:
user fake_0 fake_1
0 1 202 505
1 2 202 202
2 3 404 404
3 4 101 505
4 5 101 303
答案 1 :(得分:0)
我不确定这是否是最有效的解决方案,但是它可以在您的示例中使用10列,而无需您进行任何编辑。
首先,从您的item_map创建查找字典:
d = pd.Series(index=item_map['fake_id'], data=item_map['real_id'].values).to_dict()
然后,使用applymap
查找除“用户”之外的每一列:
results = users.set_index('user').applymap(lambda x: d[x]).reset_index()
如果需要,您可以重命名各列以获得所需的输出:
results.columns = [col.replace('fake', 'real') for col in results.columns]
结果:
user real_0 real_1
0 1 202 505
1 2 202 202
2 3 404 404
3 4 101 505
4 5 101 303