Объединить два кадра данных в разных именованных столбцах для нескольких столбцов - PullRequest
1 голос
/ 10 июля 2019

У меня есть два кадра данных: 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

Я попробовал следующее, основываясь на ответе, найденном здесь: как объединить два фрейма данных с разными именами столбцов в пандах? - питон

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

Это работает, но кажется глупым делать это для каждого столбца в отдельности (у меня есть девять столбцов, у которых есть fake_ids, которые должны быть 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 ]

1 голос
/ 10 июля 2019

Мы используем 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
0 голосов
/ 10 июля 2019

Я не уверен, будет ли это наиболее эффективным решением, но оно должно работать для вашего примера с 10 столбцами без необходимости что-либо редактировать.

Сначала создайте поисковый словарь из вашего item_map:

d = pd.Series(index=item_map['fake_id'], data=item_map['real_id'].values).to_dict()

Затем используйте applymap, чтобы найти каждый столбец, кроме 'user':

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...