Объединить 2 фрейма данных с ключом, разделенным на 2 столбца

#python #pandas #dataframe #merge

#python #pandas #фрейм данных #объединить

Вопрос:

У меня есть следующие 2 фрейма данных:

 >>> df = pandas.DataFrame({'category':['A','A','B','B','C','C'],'type':['X', 'Y', 'X', 'Z', 'Y','W'], 'data':[21,36,32,26,34,30]})
>>> print(df)
  category type  data
0        A    X    21
1        A    Y    36
2        B    X    32
3        B    Z    26
4        C    Y    34
5        C    W    30
  

и этот:

 >>> df2 = pandas.DataFrame({'category':['A','B','C'],'type1':['X', 'X', 'Y'],'type2':['Y','Z','W'], 'data2':[121,136,232]})
>>> print(df2)
  category type1 type2  data2
0        A     X     Y    121
1        B     X     Z    136
2        C     Y     W    232
  

Я хочу объединить оба dfs, чтобы они выглядели так:

   category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232
  

Я пробовал это:

 >>> result_test = pd.merge(df, df2,  how='left', left_on=['category','type'], right_on = ['category','type1'])
>>> print(result_test)
  category type  data type1 type2  data2
0        A    X    21     X     Y  121.0
1        A    Y    36   NaN   NaN    NaN
2        B    X    32     X     Z  136.0
3        B    Z    26   NaN   NaN    NaN
4        C    Y    34     Y     W  232.0
5        C    W    30   NaN   NaN    NaN
  

и он сливается по типу 1. Но если я попробую это снова с типом 2, он добавит еще 3 столбца

Ответ №1:

Попробуйте с melt затем merge

 out = df1.merge(df2.melt(['category','data2'],value_name='type').drop('variable',1))
out
Out[40]: 
  category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232
  

Ответ №2:

Разве это не просто слияние category ?

 df.merge(df2[['category','data2']], on='category')
  

Вывод:

   category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232
  

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

1. категория и тип являются ключами в обоих dfs