Pivot с мультииндексом во фрейме данных Pandas - PullRequest
1 голос
/ 07 марта 2019

Я работаю над отчетом, и мне нужно создать сводную таблицу.

Некоторый контекст:

  • Данные имеют два столбца даты:
    • Дата происхождения
    • Дата наблюдения
  • Каждая строка содержит несколько значений:
    • Платежи
    • Баланс
    • ...

Итак, мой оригинальный фрейм данных выглядит примерно так (небольшой пример):

obs_date     orig_date   payments   balance
2017-09-12   2019-09-12    200.00   1700.00
2019-09-19   2019-09-12      0.00   1750.00
2019-09-26   2019-09-12    100.00   1650.00
2019-09-19   2019-09-19      0.00   1235.00
2019-09-26   2019-09-19    300.00    950.00
2019-09-26   2019-09-26     50.00   3435.00

Я пытался использовать Pandas .pivot()функция на фрейме данных, но я получаю что-то вроде этого:

              payments                               balance
orig_date     2017-09-12   2017-09-19   2017-09-26   2017-09-12   2017-09-19   2017-09-26
obs_date
2017-09-12        200.00         0.00       100.00      1700.00      1750.00      1650.00
2019-09-19                       0.00       300.00                   1235.00       950.00
2019-09-26                                   50.00                                3435.00

Я хотел бы получить что-то вроде этого:

 obs_date            2017-09-12   2017-09-19   2017-09-26
orig_date
2017-09-12 payments      200.00         0.00       100.00
           balance      1700.00      1750.00      1650.00
2017-09-19 payments                     0.00       300.00      
           balance                   1235.00       950.00
2017-09-26 payments                                 50.00
           balance                                3435.00

Итак, есть ли способчтобы получить это?


Пример кода:

import pandas as pd

df = pd.DataFrame({
    'obs_date':['2017-09-12', '2017-09-19', '2017-09-26', '2017-09-19', '2017-09-26', '2017-09-26'],
    'orig_date': ['2017-09-12', '2017-09-12', '2017-09-12', '2017-09-19', '2017-09-19', '2017-09-26'],
    'payments': [200.00, 0.00, 100.00, 0.00, 300.00, 50.00],
    'balance': [1700.00,1750.00,1650.00,1235.00,950.00,3435.00]
})

# My unsuccesful attempt:
cols = [c for c in df.columns if c not in ['obs_date', 'orig_date']]
df_pivot = df.pivot(index='orig_date', columns='obs_date', values=cols)

1 Ответ

3 голосов
/ 07 марта 2019

Вы очень близки к исправлению вашего кода на stack

df_pivot.stack(level=0)
Out[682]: 
obs_date             2017-09-12  2019-09-19  2019-09-26
orig_date                                              
2019-09-12 balance       1700.0      1750.0      1650.0
           payments       200.0         0.0       100.0
2019-09-19 balance          NaN      1235.0       950.0
           payments         NaN         0.0       300.0
2019-09-26 balance          NaN         NaN      3435.0
           payments         NaN         NaN        50.0
...