Как преобразовать панду MultiIndex DataFrame в 3D-массив - PullRequest
0 голосов
/ 10 февраля 2019

Предположим, у меня есть MultiIndex DataFrame:

                                c       o       l       u
major       timestamp                       
ONE         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008

TWO         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008

Я хочу сгенерировать массив NumPy из этого DataFrame с 3-мерным, учитывая, что в главном столбце данных имеется 15 категорий, 4 столбца и одинвременный индекс длины 5. Я хотел бы создать пустой массив с формой (4,15,5) , обозначающей (столбцы, категории, time_index) соответственно.

должен создать массив:

array([[[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]]])

Раньше это можно было сделать с помощью pd.Panel:

panel = pd.Panel(items=[columns], major_axis=[categories], minor_axis=[time_index], dtype=np.float32)
... 

Как бы я мог наиболее эффективносделать это с мультииндексным фреймом данных? Спасибо

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Как насчет использования xarray?

res = df.to_xarray().to_array()

Результатом является массив формы (4, 15, 5)

На самом деле документы сейчас рекомендуют это как альтернатива пандам Panel.Обратите внимание, что у вас должен быть установлен пакет xarray.

0 голосов
/ 10 февраля 2019

Поскольку df.values является массивом (15*100, 4) -образной формы, вы можете вызвать reshape, чтобы сделать его массивом (15, 100, 4) -образной формы:

arr = df.values.reshape(15, 100, 4)

Затем вызвать transpose, чтобы перегруппироватьпорядок осей:

arr = arr.transpose(2, 0, 1)

Теперь arr имеет форму (4, 15, 100).


Использование reshape/transpose в ~ 960 раз быстрее, чем to_xarray().to_array():

In [21]: df = pd.DataFrame(np.random.randint(10, size=(15*100, 4)), index=pd.MultiIndex.from_product([range(15), range(100)], names=['A','B']), columns=list('colu'))

In [22]: %timeit arr = df.values.reshape(15, 100, 4).transpose(2, 0, 1)
3.31 µs ± 23.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [24]: %timeit df.to_xarray().to_array()
3.18 ms ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [25]: 3180/3.31
Out[25]: 960.7250755287009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...