Как сопоставить фрейм данных по столбцу соответствия

#python #pandas #dataframe #join

#python #панды #фрейм данных #Присоединиться

Вопрос:

Я новичок в pandas. Я пытаюсь объединить два набора данных, как показано ниже:

df1:

 df1 = pd.DataFrame({'id': [1121, 1122, 1123, 1124, 1125], 'name': ['F.01', 'F.01', 'F.02', 'F.02', 'F.02'], 'description': ['r1', 'r2', 'l1', 'l2', 'l3']})
  

Выглядит так:

   id  name description
1121  F.01 r1
1122  F.01 r2
1123  F.02 l1
1124  F.02 l2
1125  F.02 l3
  

df2:

 df2 = pd.DataFrame({'code': ['F.01', 'F.02'], 'r1': [1, 0], 'r2': [2, 0], 'l1': [0, 3], 'l2': [0, 4], 'l3': [0, 5]})
  

df2 выглядит так:

 code  r1  r2  l1  l2  l3
F.01   1   2   0   0   0
F.02   0   0   3   4   5
  

Результат, который я хотел бы, чтобы они соответствовали

 df1.name = df2.code
df1.description = df2.(column name)
  

Результат, который я предпочитаю, выглядит так:

   id  name description value
1121  F.01 r1          1
1122  F.01 r2          2
1123  F.02 l1          3
1124  F.02 l2          4
1125  F.02 l3          5
  

Спасибо!

Комментарии:

1. df2.melt("code") а затем выполните merge с df1 помощью .

Ответ №1:

Общее руководство Генри правильное, но в нем отсутствуют некоторые необходимые детали.

Для получения ожидаемого результата требуются следующие шаги:

  • переименовать код в df2 в name,
  • расплавьте df2 по имени, установив var_name в description,
  • объедините df1 с приведенным выше результатом расплава по имени и описанию.

Код для этого:

 result = pd.merge(df1, df2.rename(columns={'code': 'name'}).melt(
    'name', var_name='description'), on=['name', 'description'])
  

Результат:

      id  name description  value
0  1121  F.01          r1      1
1  1122  F.01          r2      2
2  1123  F.02          l1      3
3  1124  F.02          l2      4
4  1125  F.02          l3      5