Как объединить фрейм данных Panda Time Series без потери строки? - PullRequest
0 голосов
/ 08 января 2019

Заголовок

  1. Как объединить фрейм данных временных рядов без потери строк?
  2. Конечный результат формы DataFrame должен основываться на том, какой DataFrame имеет большую форму DataFrame.

DF1:

0  17.12.2014 13:56:56                        1.9
1  17.12.2014 13:56:58                        3.1
2  17.12.2014 13:56:59                        2.8
3  17.12.2014 13:57:10                        2.3
4  17.12.2014 13:57:11                        3.1

df1.shape составляет около 3000

df2:
       Time                                    Value
1   17.12.2014 13:55:56                        2.9
2   17.12.2014 13:55:58                        6.0
3   17.12.2014 13:55:58                        3.6
4   17.12.2014 13:55:59                        2.8
5   17.12.2014 13:56:07                        1.9
6   17.12.2014 13:56:12                        2.9
7   17.12.2014 13:56:12                        3.0
8   17.12.2014 13:56:13                        1.8
9   17.12.2014 13:56:15                        2.2
10  17.12.2014 13:56:15                        2.0
11  17.12.2014 13:56:41                        1.7
12  17.12.2014 13:56:41                        2.4
13  17.12.2014 13:56:42                        2.8
14  17.12.2014 13:56:42                        1.9
15  17.12.2014 13:56:43                        2.8
16  17.12.2014 13:56:43                        1.7
17  17.12.2014 13:56:44                        2.8
18  17.12.2014 13:56:45                        1.7
19  17.12.2014 13:56:59                        2.8
20  17.12.2014 14:03:08                        1.7

df2.shape составляет около 20000

df3 

1   17.12.2014 13:56:12                        3.2

df3.shape составляет около 5000

Мне нужен результирующий DataFrame, как показано ниже, и результирующий размер dataFrame должен (20000) в соответствии с размером DF2:

    Time                   Value1          Value2                       Value3                
1   17.12.2014 13:55:56        NaN             2.9                            NaN                    
2   17.12.2014 13:55:58        NaN             6.0                            NaN                    
3   17.12.2014 13:55:58        NaN             3.6                            NaN                    
4   17.12.2014 13:55:59        NaN             2.8                            NaN                    
5   17.12.2014 13:56:07        NaN             1.9                            NaN                    
6   17.12.2014 13:56:12        NaN             2.9                            NaN                    
7   17.12.2014 13:56:12        NaN             3.0                            3.2                    
8   17.12.2014 13:56:13        NaN             1.8                            NaN                    
9   17.12.2014 13:56:15        NaN             2.2                            NaN                    
10  17.12.2014 13:56:15        NaN             2.0                            NaN                    
11  17.12.2014 13:56:41        NaN             1.7                            NaN                    
12  17.12.2014 13:56:41        NaN             2.4                            NaN                    
13  17.12.2014 13:56:42        NaN             2.8                            NaN                    
14  17.12.2014 13:56:42        NaN             1.9                            NaN                    
15  17.12.2014 13:56:43        NaN             2.8                            NaN                    
16  17.12.2014 13:56:43        NaN             1.7                            NaN                    
17  17.12.2014 13:56:44        NaN             2.8                            NaN                    
18  17.12.2014 13:56:45        NaN             1.7                            NaN       
19  17.12.2014 13:56:56        1.9             NaN                            NaN
20  17.12.2014 13:56:58        3.1             NaN                            NaN
21  17.12.2014 13:56:59        2.8             2.8                            NaN
22  17.12.2014 13:57:10        2.3             NaN                            NaN
23  17.12.2014 13:57:11        3.1             NaN                            NaN
20  17.12.2014 14:03:08        NaN             1.7                            NaN

Спасибо

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Установите индекс как время, а затем присоединитесь, используя outer. Вы можете использовать reduce из functools, чтобы сделать синтаксис кратким.

from functools import reduce

reduce(lambda l,r: l.join(r, how='outer'), [df.set_index('Time') for df in [df1, df2, df3]])

Выход:

                     Val1  Val2  Val3
Time                                 
17.12.2014 13:55:56   NaN   2.9   NaN
17.12.2014 13:55:58   NaN   6.0   NaN
17.12.2014 13:55:58   NaN   3.6   NaN
17.12.2014 13:55:59   NaN   2.8   NaN
17.12.2014 13:56:07   NaN   1.9   NaN
17.12.2014 13:56:12   NaN   2.9   3.2
17.12.2014 13:56:12   NaN   3.0   3.2
17.12.2014 13:56:13   NaN   1.8   NaN
17.12.2014 13:56:15   NaN   2.2   NaN
17.12.2014 13:56:15   NaN   2.0   NaN
17.12.2014 13:56:41   NaN   1.7   NaN
17.12.2014 13:56:41   NaN   2.4   NaN
17.12.2014 13:56:42   NaN   2.8   NaN
17.12.2014 13:56:42   NaN   1.9   NaN
17.12.2014 13:56:43   NaN   2.8   NaN
17.12.2014 13:56:43   NaN   1.7   NaN
17.12.2014 13:56:44   NaN   2.8   NaN
17.12.2014 13:56:45   NaN   1.7   NaN
17.12.2014 13:56:56   1.9   NaN   NaN
17.12.2014 13:56:58   3.1   NaN   NaN
17.12.2014 13:56:59   2.8   2.8   NaN
17.12.2014 13:57:10   2.3   NaN   NaN
17.12.2014 13:57:11   3.1   NaN   NaN
17.12.2014 14:03:08   NaN   1.7   NaN

Обратите внимание, что в предоставленном вами вводе есть две записи для 17.12.2014 13:56:12 в df2, поэтому значение в df3 было перенесено в обе эти строки.

0 голосов
/ 08 января 2019

Метод соединения построен именно для этих типов ситуаций. Вы можете присоединиться к любому количеству DataFrames вместе с ним. Вызывающий DataFrame объединяется с индексом коллекции переданных DataFrame. Для работы с несколькими фреймами данных необходимо поместить соединительные столбцы в индекс.

dfs = [df1, df2, df3]
dfs = [df.set_index('Time') for df in dfs]
dfs[0].join(dfs[1:])

Учился у @Ted Petrou, проходя онлайн-курс.

С объединением:

df1.merge(df2,on='Time', how='outer').merge(df3,on='Time')

OR

pd.merge(pd.merge(df1,df2,on='Time', how='outer'),df3,on='Time')
0 голосов
/ 08 января 2019

Я думаю, что вы хотите внешнее соединение

pd.merge(df1, df2, how = 'outer', on = 'Time')

Это делает полное внешнее соединение. Вы можете изменить outer на left, right для левого / правого внешнего соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...