Python / Pandas - объединение двух фреймов данных с разными частотами PeriodIndex - PullRequest
1 голос
/ 02 мая 2020

Я хочу объединить 2 DataFrames с разными частотами PeriodIndex и использовать для сортировки индекса второго уровня, который является позицией.

Например, у меня есть следующие 2 DataFrames.

import pandas as pd

pr1h = pd.period_range(start='2020-01-01 08:00', end='2020-01-01 11:00', freq='1h')
pr2h = pd.period_range(start='2020-01-01 08:00', end='2020-01-01 11:00', freq='2h')

n_array_1h = [2, 2, 2, 2]
n_array_2h = [0, 1, 0, 1]

index_labels_1h = [pr1h, n_array_1h]
index_labels_2h = [[pr2h[0],pr2h[0],pr2h[1],pr2h[1]], n_array_2h]

values_1h = [[1], [2], [3], [4]]
values_2h = [[10], [20], [30], [40]]

df1h = pd.DataFrame(values_1h, index=index_labels_1h, columns=['Data'])
df1h.index.names=['Period','Position']
df2h = pd.DataFrame(values_2h, index=index_labels_2h, columns=['Data'])
df2h.index.names=['Period','Position']

df1h
                           Data
Period           Position      
2020-01-01 08:00 2            1
2020-01-01 09:00 2            2
2020-01-01 10:00 2            3
2020-01-01 11:00 2            4

df2h
                       Data
Period           Position      
2020-01-01 08:00 0           10
                 1           20
2020-01-01 10:00 0           30
                 1           40

Мне бы хотелось получить df1h_new, который:

  • хранит PeriodIndex от df1h,
  • сохраняет данные из блока в df2h, имеющие period.start_time, сразу ниже или равным текущему периоду .start_time в df1h,
  • хранит данные из df1h, очевидно

Таким образом, результат будет.

df1h_new
                           Data
Period           Position      
2020-01-01 08:00 0           10  # |---> data coming from df2h, block with
                 1           20  # |     start_time =< df1h.index[0].start_time
                 2            1  # ----> data from df1h.index[0]
2020-01-01 09:00 0           10  # |---> data coming from df2h, block with 
                 1           20  # |     start_time =< df1h.index[1].start_time
                 2            2  # ----> data from df1h.index[1]
2020-01-01 10:00 0           30  # and so on...
                 1           40
                 2            3
2020-01-01 11:00 0           30
                 1           40
                 2            4

Пожалуйста, какой рекомендуемый способ достижения этого ? Я благодарю вас за вашу помощь и поддержку! Bests,

1 Ответ

1 голос
/ 02 мая 2020

Одной из идей является использование concat с Series.unstack и изменение частоты на такое же на Series.asfreq, затем заполнение значений misisng и изменение формы обратно до MultiIndex:

df = (pd.concat([df1h['Data'].unstack(),
                 df2h['Data'].unstack().asfreq('H')], axis=1)
        .bfill()
        .stack()
        .sort_index()
        .to_frame('Data'))
print (df)
                           Data
Period           Position      
2020-01-01 08:00 0         10.0
                 1         20.0
                 2          1.0
2020-01-01 09:00 0         10.0
                 1         20.0
                 2          2.0
2020-01-01 10:00 0         30.0
                 1         40.0
                 2          3.0
2020-01-01 11:00 0         30.0
                 1         40.0
                 2          4.0
...