Заменить несколько столбцов данных с идентификатором из другого кадра данных - PullRequest
1 голос
/ 28 мая 2019

У меня есть Pandas Dataframe df1 как:

ID | c1 | c2 | c3
-----------------
1  | A  | B  | 32
2  | C  | D  | 34
3  | A  | B  | 11
4  | E  | F  | 3

И df2 :

ID | c1 | c2
------------
1  | A  | B
2  | C  | D
3  | E  | F

Существует внешний ключ между df1 и df2 в столбцах (c1, c2). Регистрация выглядит так:

pd.merge(df1, df2, left_on=['c1','c2'], right_on = ['c1','c2'])

Результат:

ID_x| c1 | c2 | c3 | ID_y
-------------------------
1   | A  | B  | 32 | 1
2   | C  | D  | 34 | 2
3   | A  | B  | 11 | 1
4   | E  | F  | 3  | 3

Я хочу заменить (c1, c2) в df1 на df2.id . Ожидаемый финал df1:

ID| c3 | df2_id
---------------
1 | 32 | 1
2 | 34 | 2
3 | 11 | 1
4 | 3  | 3

Другими словами, я хочу добавить столбец 'df2_id' в df1 (заполненный значением df2.id для этой строки) и удалить столбцы (c1, c2) (они больше не нужны).

У меня есть идея сделать это:

  1. сохранить результат из объединить в df1
  2. удалить ненужные столбцы (c1, c2)
  3. переименуйте 'ID_y' в 'df2_id' и 'ID_x' в 'ID'

Есть ли лучшее решение?

1 Ответ

2 голосов
/ 28 мая 2019

Мы могли бы сделать один вкладыш из ваших шагов, используя suffixes аргумент и on вместо left_on, right_on плюс плюс цепочка методов с drop:

df1.merge(df2, on=['c1','c2'], suffixes=['_1', '_2']).drop(['c1', 'c2'], axis=1)

выход

   ID_1  c3  ID_2
0     1  32     1
1     3  11     1
2     2  34     2
3     4   3     3

Чтобы сделать его точно таким же, как вывод OP:

df1.merge(df2, on=['c1','c2'], suffixes=['', '_2']).drop(['c1', 'c2'], axis=1).rename(columns={"id_2": "df2_id"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...