Объединить 2 кадра данных панд, используя похожие данные - PullRequest
0 голосов
/ 29 июня 2018

Я не могу найти элегантное решение для объединения этих двух наборов данных:

Допустим, у меня есть первый набор данных с температурой городов

       2016 2017
cityA   23  27
cityB   24  28

И еще один с большим количеством информации, но это выглядит так:

    city    year    other
0   cityA   2016    aa
1   cityB   2017    bb
2   cityA   2016    cc
3   cityB   2017    dd

И мне бы хотелось получить следующий результат:

     city  year other  temperatures
0   cityA   2016    aa    23
1   cityB   2017    bb    28
2   cityA   2016    cc    23
3   cityB   2017    dd    24

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: реальные и более сложные кадры данных:

датафрейм 1 с температурой enter image description here

датафрейм 2 с другими данными: enter image description here

Результаты выполнения ответа:

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

расплав + слияние

Вы можете растопить свой «развернутый» фрейм данных, а затем объединить его с вашим основным фреймом данных. Предполагается, что столбцы года в вашем первом кадре данных являются целыми числами.

melted = pd.melt(df1.reset_index(), id_vars='index')

res = df2.merge(melted, left_on=['city', 'year'],
                right_on=['index', 'variable'], how='left')

print(res[['city', 'year', 'other', 'value']])

    city  year other  value
0  cityA  2016    aa     23
1  cityB  2017    bb     28
2  cityA  2016    cc     23
3  cityB  2017    dd     28
0 голосов
/ 29 июня 2018

Используйте stack с reset_index для изменения формы, а затем merge, я думаю с левым соединением:

df11 = df1.stack().reset_index()
df11.columns = ['city','year','temperatures']
#if years are strings convert to integers
df11['year'] = df11['year'].astype(int)

df = df2.merge(df11, on=['city','year'], how='left')
print (df)
    city  year other  temperatures
0  cityA  2016    aa            23
1  cityB  2017    bb            28
2  cityA  2016    cc            23
3  cityB  2017    dd            28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...