猿问

Python / Pandas:如何创建一个多索引的空 DataFrame,然后开始填充它?

我想使用pd.MultiIndex.


基本上,行轴有两个级别,列轴也有。在管理数据帧集的类中,我将这个“元数据帧”定义为类变量。


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'])

现在,每次我处理一个单独的 DataFrameid时,我都想相应地更新这个“元数据帧”。id有一个日期时间索引,周期为“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不同时期的 DataFrame):


           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中初始化这些值的正确方法是什么?


鸿蒙传说
浏览 168回答 1
1回答

红颜莎娜

您可以将数据存储在字典的字典中,而不是填充空的 DataFrame。MultiIndextuples用作索引值,因此我们制作每个字典元组的键。外部字典使用列 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 Lastid1 5m     72         1   10    10m   -18         2   20创建它dict取决于您如何获得这些值。你可以扩展一个字典update
随时随地看视频慕课网APP

相关分类

Python
我要回答