【问题标题】:Python / Pandas: How creating an multi-index empty DataFrame, and then starting to fill it?Python / Pandas:如何创建一个多索引的空 DataFrame,然后开始填充它?
【发布时间】:2020-08-14 22:35:39
【问题描述】:

我想使用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'])

现在,每次我处理一个单独的 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 中初始化这些值的正确方法是什么?

感谢您的帮助! 最好的,

【问题讨论】:

  • MD.loc[('id','5m'), ('Timestamp','First')] = id.index[0]?
  • 谢谢,但它对我不起作用。对你起作用吗?我有一条ValueError: Names should be list-like for a MultiIndex 消息。

标签: python pandas dataframe multi-index


【解决方案1】:

您可以将数据存储在一个字典中,而不是填充一个空的 DataFrame。 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 将取决于您如何获取这些值。你可以extend a dict with update

【讨论】:

  • 感谢您对 ALollz 的支持,但是,我不确定如何处理您的建议。我一一获得价值。因此,即使我可以按照您对第一个值的建议进行操作,那么当我有第二个值要管理并且我已经将我的 dict 转换为数据框时,我该如何更新 DataFrame 呢?我实际上回到了最初的问题:如何在多索引 DataFrame 中添加和/或修改单元格。
  • @pierre_j 很难不知道如何获得这些个人价值。但是dict应该与MultiIndex没有什么不同。例如,以d={} 开头,您可以添加类似d[('Score', 'Min')] = {('id', '5m'): 72} 的值。然后,如果您需要添加另一行,您可以执行 d[('Score', 'min')].update({('id', '10m'): 5}) 之类的操作以极少的行数构建。
  • 另一方面,如果这些来自不同的 DataFrame,可能有一种 much 更简单的方法来获取您需要的所有信息,然后您可以使用 concat keys 标记所有内容。同样,这一切都需要事先进行一些周到的组织,以保持事情的可管理性和自我命名。
  • 每当我在文件中记录单个数据帧时,都会更新这个多索引数据帧。如果我在文件中记录一个单独的 DataFrame,那是因为我要么创建了它,要么扩展了它。此时,我想保留在多索引 DataFrame 中的值可能已经改变(例如最后一个 DateTimeIndex 值,或者一列的最小值或最大值)所以此时,我需要在 multi 中添加新值-index DataFrame,或修改现有的。
  • 我没有一次获得所有值。多索引 DataFrame 是存储“活”数据的方式
猜你喜欢
  • 2012-11-26
  • 2019-05-08
  • 1970-01-01
  • 2021-03-04
  • 2019-04-26
  • 1970-01-01
  • 2021-05-21
  • 2018-04-17
相关资源
最近更新 更多