将不同命名列上的两个数据框合并为多个列

时间:2019-07-10 17:00:32

标签: pandas dataframe merge

我有两个数据帧:Users and Item_map

Users由存储在三列中的user and fake_item_ids组成。

Item_mapreal_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]
    })

2 个答案:

答案 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