Какой эффективный способ сложить многоуровневую сводную таблицу в Python pandas? - PullRequest
1 голос
/ 08 апреля 2020

Учитывая следующий фрейм данных:

test_df = pd.DataFrame({'date': ['2020-01-01', '2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02', '2020-01-02'], 'A': [1,2,3,4,5,6], 'B': ['a', 'b', 'c', 'd', 'e', 'f'], 'C': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff'], 'val': [100, 200, 300, 400, 500, 600]})
test_df['date'] = pd.to_datetime(test_df['date'])

Я формирую следующую сводную таблицу (причина для этого выходит за рамки этого вопроса.):

test_pivot_table = test_df.pivot_table(index='date', columns=['A', 'B', 'C'], values='val')

Предположим, что после Я выполняю некоторые операции, такие как повторная выборка индекса даты и времени, и хочу вернуть его в исходную табличную форму. Какой самый эффективный способ преобразовать его обратно?

Текущий способ, которым я делаю это прямо сейчас:

test_pivot_table.stack().stack().stack().to_frame('val').reset_index()

Однако для больших фреймов данных тройные операции stack() медленно и очень интенсивно использует память.

1 Ответ

2 голосов
/ 08 апреля 2020

Используйте DataFrame.unstack с удалением пропущенных значений:

print (test_pivot_table.unstack().dropna().reset_index(name='val'))
   A  B   C       date    val
0  1  a  aa 2020-01-01  100.0
1  2  b  bb 2020-01-01  200.0
2  3  c  cc 2020-01-01  300.0
3  4  d  dd 2020-01-02  400.0
4  5  e  ee 2020-01-02  500.0
5  6  f  ff 2020-01-02  600.0
...