Python / Pandas: Как создать многоиндексный пустой DataFrame, а затем начать его заполнять? - PullRequest
2 голосов
/ 30 апреля 2020

Я хотел бы сохранить сводку локального набора DataFrames в «мета-кадре», используя pd.MultiIndex.

По сути, ось строки имеет два уровня, а также ось столбца. В классе, управляющем набором DataFrames, я определяю в качестве переменной класса этот «метаданный фрейм».

import pandas as pd

row_axis = pd.MultiIndex(levels=[[],[]], codes=[[],[]], names=['Data', 'Period'])
column_axis = pd.MultiIndex(levels=[[],[]], codes=[[],[]], names=['Data', 'Extrema'])
MD = pd.DataFrame(index=row_axis, columns=column_axis)

Кажется, что он работает.

MD.index
>>> MultiIndex([], names=['Data', 'Period'])

MD.columns
>>> MultiIndex([], names=['Data', 'Extrema'])

Теперь каждый раз, когда я обрабатываю отдельный DataFrame id, я хочу обновить этот "Meta DataFrame" соответственно. id имеет DateTimeIndex с периодом '5m'.

id.index[0]
>>> Timestamp('2020-01-01 08:00:00')

id.index[-1]
>>> Timestamp('2020-01-02 08:00:00')

Я хочу сохранить в MD его первые и последние значения индекса, например.

MD.loc[[('id', '5m')],[('Timestamp', 'First')]] = id.index[0]
MD.loc[[('id', '5m')],[('Timestamp', 'Last')]] = id.index[-1]

Это не работает , Я получаю следующее сообщение об ошибке:

TypeError: unhashable type: 'list'

В конце я хотел бы получить в MD следующий тип информации (у меня есть другие id DataFrames с разными периодами):

           Timestamp
           First                   Last
id    5m   2020-01-01 08:00:00     2020-01-02 08:00:00
     10m   2020-01-05 08:00:00     2020-01-06 18:00:00

В конечном итоге я также сохраню минимальные и максимальные значения некоторых столбцов в id. Например, если id имеет столбец «Температура».

           Timestamp                                     Temperature
           First                Last                     Min    Max
id    5m   2020-01-01 08:00:00  2020-01-02 08:00:00      -2.5   10
     10m   2020-01-05 08:00:00  2020-01-06 18:00:00      4      15

Эти значения будут записаны при записи id.

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

Кроме того, я не понимаю, как я могу управлять этой организацией информации в Dict, поэтому я рассматриваю возможность сделать это с несколькими Уровень DataFrame. Затем я сохраню его в файле csv для хранения этих «метаданных».

Пожалуйста, как правильно инициализировать каждое из этих значений в MD?

Я благодарю вас за вашу Помогите! Bests,

1 Ответ

1 голос
/ 30 апреля 2020

Вместо заполнения пустого DataFrame вы можете хранить данные в формате dict. MultiIndex использует tuples в качестве значений индекса, поэтому мы делаем ключи каждого кортежа словаря.

Внешний словарь использует кортежи MultiIndex в качестве ключей, а значения - это другой словарь со строкой кортежей MultiIndex в качестве ключей и значение, которое входит в ячейку в качестве значения.

d = {('Score', 'Min'):       {('id1', '5m'): 72, ('id1', '10m'): -18},
     ('Timestamp', 'First'): {('id1', '5m'): 1, ('id1', '10m'): 2},
     ('Timestamp', 'Last'):  {('id1', '5m'): 10, ('id1', '10m'): 20}}
     #        |                     |                            |
     #  Column MultiIndex       Row Multi                    Cell Value
     #       Label                Label     

pd.DataFrame(d)

        Score Timestamp     
          Min     First Last
id1 5m     72         1   10
    10m   -18         2   20

Создание этого dict будет зависеть от того, как вы получите значения. Вы можете продлить диктовку с помощью update

...