Вы также можете использовать stack
, чтобы упорядочить данные в правильном двумерном представлении для заполнения (по столбцам), а затем откатить обратно в исходный формат. Это обрабатывает столбцы (то есть индексы) отдельно, а не пролонгирует значения данных, как в случае другого решения.
a = ['2020-03-03','2020-03-04','2020-03-05', '2020-03-06']
b = ['A', 'B', 'C']
c = ['value1', 'value2']
df = pd.DataFrame(data=None, index=pd.MultiIndex.from_product([a,b]), columns=c)
df.loc[('2020-03-03', slice(None)), 'value1'] = np.array([100, 222, 5000])
df.loc[('2020-03-04', 'B'), 'value1'] = 1.0
df.loc[('2020-03-05', 'A'), 'value1'] = 200.0
df.loc[('2020-03-06', 'C'), 'value1'] = 20
df['value2'] = df['value1']
df.loc[('2020-03-03', 'C'), 'value2'] = np.nan
df
value1 value2
timestamp id
2020-03-03 A 100 100
2020-03-03 B 222 222
2020-03-03 C 5000 NaN # <- OBS!
2020-03-04 A NaN NaN
2020-03-04 B 1 1
2020-03-04 C NaN NaN
2020-03-05 A 200 200
2020-03-05 B NaN NaN
2020-03-05 C NaN NaN
2020-03-06 A NaN NaN
2020-03-06 B 20 20
2020-03-06 C NaN NaN
Использование df.unstack().fillna(method='ffill')
дает
value1 value2
A B C A B C
timestamp
2020-03-03 100 222 5000 100 222 NaN
2020-03-04 100 1 5000 100 1 NaN
2020-03-05 200 1 5000 200 1 NaN
2020-03-06 200 1 20 200 1 20
Это может быть возвращен с помощью .stack()
к исходному формату снова.
Сравнивая это с df.sort_index(level=1).ffill().reindex(df.index)
, разница в последнем столбце, где начиная с 'C', начиная с NaN
значение из 'B '1 превращается в начало' C 'для' Value2 '.