#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