объединение двух кадров данных в пандах - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть два фрейма данных ниже:

import pandas as pd

data1 = {'date' : ['1', '2','3'],
     'value1' : ['a', 'b' ,'c'],
     'value2' : ['12','24','4']}
data2 = {'date' : ['2','3','4'],
     'value1' : ['b', 'c' ,'g'],
     'value2' : ['24','4','55']}

df1 = pd.DataFrame(data1)
df1 = df1.set_index('date')
df2 = pd.DataFrame(data2)
df2 = df2.set_index('date')

и вот мой желаемый вывод:

desired_result = {'date' : ['1','2','3','4'],
     'value1' : ['a', 'b', 'c', 'g'],
     'value2' : ['12', '24', '4', '55']}

Я пробовал все различные виды слияния, объединения, объединения, но не смогт выяснить.Спасибо.

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Почувствуй себя groupby проблемой

pd.concat([df1,df2]).groupby(level=0).last()
     value1 value2
date              
1         a     12
2         b     24
3         c      4
4         g     55
0 голосов
/ 26 февраля 2019

Если вы используете простое объединение / слияние, у вас будет несколько нулевых значений.

pandas.DataFrame.combine_first или pandas.DataFrame.combine существуют для этой цели.

Простое: df1.combine_first(df2) должно работать просто отлично.

0 голосов
/ 26 февраля 2019

Это, безусловно, идеальная проблема merge, просто используйте объединение outer и выберите правильное keys для объединения следующим образом.

Удалите set_index для кадров данных, выэто не нужно.

data1 = {'date' : ['1', '2','3'],
     'value1' : ['a', 'b' ,'c'],
     'value2' : ['12','24','4']}
data2 = {'date' : ['2','3','4'],
     'value1' : ['b', 'c' ,'g'],
     'value2' : ['24','4','55']}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)


# join with the key columns date, value1 & value2
df4 = pd.merge(df1, df2, on=['date', 'value1', 'value2'], how='outer')

Вывод

    date    value1  value2
0   1       a       12
1   2       b       24
2   3       c       4
3   4       g       55
0 голосов
/ 26 февраля 2019

Это не совсем проблема слияния, но вы можете использовать combine_first:

df1.combine_first(df2).reset_index()

  date value1 value2
0    1      a     12
1    2      b     24
2    3      c      4
3    4      g     55

Другое предложение - concat и drop_duplicates:

pd.concat([df1, df2]).reset_index('date').drop_duplicates('date')

  date value1 value2
0    1      a     12
1    2      b     24
2    3      c      4
5    4      g     55
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...