Как объединить 2 кадра данных независимо от метки времени строки? - PullRequest
0 голосов
/ 09 июня 2019

Я хотел бы объединить 2 кадра данных с одинаковым количеством строк независимо от отметки времени каждой строки. Я просто хочу данные рядом (они уже отсортированы). Я пытался избавиться от отметок времени, а затем объединить кадры данных, но безуспешно.

Вот 1-й кадр данных (как показано в терминале):

                              Open     High
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64
2019-04-11 05:00:00+00:00  5180.18  5183.11

А вот и второй кадр данных:

                            Open_2h   High_2h
Timestamp
2019-04-11 04:00:00+00:00     5100       5300
2019-04-11 06:00:00+00:00     5200       5400

Вот результат, который я хотел бы получить:

                              Open     High  Open_2h  High_2h
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11     5200     5400

Итак, я попробовал следующий код:


result = pd.DataFrame()
df1.reset_index()
df2.reset_index()
result = pd.concat([df1, df2], axis=1 , sort=False)

Я тоже пробовал:


result = pd.DataFrame()
df1.reset_index()
df2.reset_index()
result = df1.join(df2)

Я также пытался заранее форсировать новый индекс в df1 & df2:


indexlist = list(range(0,2))
df1.loc[:,'Index'] = indexlist
df1.set_index('Index')
df2.loc[:,'Index'] = indexlist
df2.set_index('Index')

Но данные временной метки остаются индексом, на который опирается панда для операции «соединение» или «объединение».

И с любым из приведенного выше кода, вот что я получаю:

                              Open     High  Open_2h  High_2h
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11      NaN      NaN
2019-04-11 06:00:00+00:00      NaN      NaN     5200     5400

Я попробовал решение merge_asof, указанное ниже, но со следующими данными появляются повторяющиеся строки:

df1

                           Open     High
Timestamp
2019-04-11 03:00:00+00:00  3000     3100
2019-04-11 04:00:00+00:00  4000     4100
2019-04-11 05:00:00+00:00  5000     5100

df2

                          Open_2h     High_2h
Timestamp
2019-04-11 00:00:00+00:00   0500         0600
2019-04-11 02:00:00+00:00   2500         2600
2019-04-11 04:00:00+00:00   4500         4600

Я получаю:

                             Open     High  Open_2h  High_2h
Timestamp        
2019-04-11 03:00:00+00:00        3000     3100     2500     2600                                
2019-04-11 04:00:00+00:00        4000     4100     4500     4600
2019-04-11 05:00:00+00:00        5000     5100     4500     4600

Временная метка все еще синхронизируется между двумя кадрами данных, и когда в df2 не найдена соответствующая временная метка, копируются предыдущие значения.

Может ли кто-нибудь помочь мне избавиться от метки времени этих фреймов данных для выполнения такой конкатенации?

Заранее благодарю за помощь.

С уважением,

Pierre

Ответы [ 3 ]

1 голос
/ 09 июня 2019

это merge_asof()

pd.merge_asof(df1.reset_index(),df2.reset_index(),on='Timestamp').set_index('Timestamp')

                             Open     High  Open_2h  High_2h
Timestamp                                                    
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11     5100     5300

, если вы не хотите, чтобы учитывался индекс второго df:

df1.reset_index().combine_first(df2.reset_index(drop=True)).set_index('Timestamp')

                              High  High_2h     Open  Open_2h
Timestamp                                                    
2019-04-11 04:00:00+00:00  5191.64   5300.0  5143.50   5100.0
2019-04-11 05:00:00+00:00  5183.11   5400.0  5180.18   5200.0
0 голосов
/ 09 июня 2019

Хорошо, я думаю, что отсутствующая часть в "reset_index ()" была "inplace = True".Итак, следующий код выполняет свою работу:


df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
result = df1.join(df2, sort=False)

Пффууухх Однажды на этом!;)

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

Bests,

Pierrot

0 голосов
/ 09 июня 2019

вы могли бы сделать

df3 = pd.merge(df1.reset_index(),df2.reset_index(),how='outer',left_on=['Timestamp'],right_on=['Timestamp'])
...