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

问题描述 投票:1回答:1

我想把本地一组DataFrames的摘要存储到一个 "元DataFrame "中,用 pd.MultiIndex.

基本上,行轴有两层,列轴也有两层,在管理DataFrames集合的类中,我定义了一个类变量 "Meta DataFrame"。

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 有一个周期为'5m'的DateTimeIndex。

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。

python pandas dataframe multi-index
1个回答
1
投票

你可以将数据存储在一个dict的dict中,而不是填充一个空的DataFrame。一个MultiIndex使用 tuples 作为索引值,所以我们把每个字典的键做成元组。

外的Dictionary以列MultiIndex元组为键,而值则是另一个以行MultiIndex元组为键,以单元格中的值为值的Dictionary。

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

© www.soinside.com 2019 - 2024. All rights reserved.