Как объединить / объединить / объединить два или более фреймов данных Pandas, индексированных по дате и времени, и заполнить пробелы с помощью NaN

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

Почему мой вопрос отличается от других с той же темой, merge / concat / join?

Я пытаюсь объединить 2 фрейма данных Pandas. Оба они проиндексированы по временным меткам, но разные даты. Я хотел бы объединить оба без повторения значений и заполнения пробелов с помощью NaN.

Некоторые фреймы имеют разную длину.

У меня есть 2 фрейма данных, как показано ниже:

            c1b28dc
date    
2016-02-01  291
2016-02-01  159
2016-02-02  322
2016-02-03  31
2016-02-10  8
 
             956773a
date    
2016-02-01  350
2016-02-01  27
2016-02-02  11
2016-02-02  8
2016-02-02  25
 

Но когда я объединил их, я получил:

            c1b28dc         956773a
date        
2016-02-01  291.0          350.0
2016-02-01  291.0          27.0
2016-02-01  159.0          350.0
2016-02-01  159.0          27.0
2016-02-02  322.0          11.0
2016-02-02  322.0          8.0
2016-02-02  322.0          25.0

 

И то, что я хочу, это:

            c1b28dc         956773a
date        
2016-02-01  291.0          350.0
2016-02-01  159.0          27.0
2016-02-02  322.0          11.0
2016-02-02  NaN            8.0
2016-02-02  NaN            25.0
2016-02-03  31             NaN
2016-02-10  8              NaN
 

Я пробую другой метод с concat, join и merge, но я не получил никаких улучшений.

 df1.merge(df2, how='outer', left_index=True, right_index=True)

pd.concat([df1,df2], axis=1)

df1.join(df2)
 

Любая помощь?

Ответ №1:

Я назначаю новый ключ cumcount здесь, чтобы помочь merge

 df1=df1.assign(key=df1.groupby(level=0).cumcount()).reset_index()
df2=df2.assign(key=df2.groupby(level=0).cumcount()).reset_index()
df=df1.merge(df2,how='right')
# you can drop the columns by df=df.drop('key',1)
         date  c1b28dc  key  956773a
0  2016-02-01    291.0    0      350
1  2016-02-01    159.0    1       27
2  2016-02-02    322.0    0       11
3  2016-02-02      NaN    1        8
4  2016-02-02      NaN    2       25
 

Обновить

 df1.merge(df2,how='outer').sort_values('date').drop('key',1)
        date  c1b28dc  956773a
0 2016-02-01    291.0    350.0
1 2016-02-01    159.0     27.0
2 2016-02-02    322.0     11.0
5 2016-02-02      NaN      8.0
6 2016-02-02      NaN     25.0
3 2016-02-03     31.0      NaN
4 2016-02-10      8.0      NaN
 

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

1. Я написал то же самое, что вы мне дали, но я получил другой результат. Пока row[2] все хорошо, но вместо этого row[3] я получаю date: 2016-02-03 date: 2016-02-02 снова

2. @SalvadorVigo Я не уверен, что здесь происходит, я могу предоставить свои данные, может быть, вы можете попробовать?

3. Я думаю, что знаю проблему. в вашем вводе индекс представляет собой строки, а не объекты datetime. В моем случае это типы datetime

4. @SalvadorVigo даже если это дата и время, все еще работает. позвольте мне попробовать

5. @SalvadorVigo да, это дает тот же результат