Python/Pandas:如何创建多索引空数据帧,然后开始填充它?

Python/Pandas:如何创建多索引空数据帧,然后开始填充它?,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我想使用pd.MultiIndex将本地数据帧集的摘要存储到“元数据帧”中 基本上,行轴有两个级别,列轴也有。 在管理数据帧集的类中,我将这个“元数据帧”定义为类变量 它似乎起作用了 MD.index >>> MultiIndex([], names=['Data', 'Period']) MD.columns >>> MultiIndex([], names=['Data', 'Extrema']) 现在,每次我处理一个单独的数据帧id,我都想相应地更新

我想使用
pd.MultiIndex
将本地数据帧集的摘要存储到“元数据帧”中

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

它似乎起作用了

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

MD.columns
>>> MultiIndex([], names=['Data', 'Extrema'])
现在,每次我处理一个单独的数据帧
id
,我都想相应地更新这个“元数据帧”<代码>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
DataFrames,时间段不同):

最后,我还将保留
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
时,将记录这些值

我知道每个单元初始化一个数据帧单元的时间效率不高,但不会经常这样做

此外,我不知道如何在Dict中管理这种信息组织,这就是我考虑使用多级数据帧的原因。 然后我会将其转储到csv文件中,以存储这些“元数据”

请问,在MD中初始化这些值的正确方法是什么

谢谢你的帮助!
最好,

您可以将数据存储在一个dict of dict中,而不是填充一个空数据框。多索引使用
元组
作为索引值,因此我们制作每个字典元组的键

外部字典使用列多索引元组作为键,值是另一个字典,行多索引元组作为键,单元格中的值作为值

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)



创建
dict
将取决于如何获取值。你可以

MD.loc[('id','5m'),('Timestamp','First')]=id.index[0]
?谢谢,但对我来说不起作用。对你有用吗?我有一个
ValueError:名字应该是多索引
邮件的列表。感谢您的支持Alolz,但是,我不知道如何处理您的建议。我一个接一个地得到价值。所以,即使我可以按照你对第一个值的建议去做,那么当我有第二个值要管理,并且我已经将dict转换成了一个数据帧时,我该如何更新数据帧呢?实际上,我回到了我最初的问题:如何在多索引数据框中添加和/或修改单元格。@pierre_j不知道如何获得这些单独的值是很困难的。但是dict应该与MultiIndex没有什么不同。例如,从
d={}
开始,您可以添加一个值,如
d[('Score','Min')]={('id','5m'):72}
。然后,如果需要添加另一行,您可以执行类似于
d[('Score','min')].update({('id','10m'):5})
的操作,理想情况下,您不必每次都键入这一行,而是可以通过编程方式引用行和列的多索引标签,这样可以在非常少的行中构建dict,如果这些数据来自不同的数据帧,那么可能有一种更简单的方法来获取您需要的所有信息,然后您可以使用
来标记所有信息。同样,这一切都需要事先进行一点深思熟虑的组织,以保持事情的可管理性和自命名性。每当我在文件中记录单个数据帧时,就会更新此多索引数据帧。如果我在一个文件中记录一个单独的数据帧,那是因为我创建了它,或者扩展了它。此时,我希望保留在多索引数据框中的值可能已更改(例如,最后一个DateTimeIndex值,或列的最小值或最大值),因此此时,我需要在多索引数据框中添加新值,或修改现有值。我没有一次获得所有值。多索引数据帧是存储“活动”数据的一种方法
           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
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