首页 > 解决方案 > 如何在忽略一级的情况下访问熊猫多索引中的对象

问题描述

我试图找到一种方法来执行这个循环。基本上,我有一堆需要访问的数据。我有一个 ID 号和收集数据的时间,对于每个数据点,我收集了多个变量(它们自己存储在 DataFrames/Series/Numbers 中)。所以我为一个系列创建了一个 MultiIndex,我在其中存储了最终看起来像这样的数据。

df =

ID No    Time    Variable
123      0.1     A         (Dataframe)
                 B         (Dataframe)
                 C         (Dataframe)
127      0.8     A         (Dataframe)
                 B         (Dataframe)
                 C         (Dataframe)
...

问题是 - 有时按 ID 号收集数据很方便(给我所有 ID 在此范围内的数据),而其他时候按时间收集更容易(给我这段时间和这段时间之间的数据)。

可能需要注意的是,我的“时间”值通常是提前未知的,并且不像这里看到的那样“整洁”。(例如,它们可能是 0.1236943)。

我遇到的问题是如何在处理数据时访问我的变量。例如,假设我想遍历数据集中的所有 ID。我可能会这样做:

for i in df.index.get_level_values("ID No").unique(): # This could be "Time" instead of ID No if that's what I wanted instead.
    thisData = df[i]

但是当我这样做时,我会得到:

thisData =

Time    Variable
0.1     A          (Dataframe)
        B          (Dataframe)
        C          (Dataframe)

由于我可能不知道 Time 的值,我如何访问我的变量(或者更具体地说,它们存储的数据)?KeyError如果我尝试这样的数据 ['A'],我会得到一个。

作为相关说明,我将始终分析一组所有变量中的数据。IE - 对于循环的每次迭代,我将仅分析A、B 和 C 的特定 ID No/Time 值。鉴于此,是否有更好的方法来执行此循环?

标签: pythonpandasmulti-index

解决方案


我最终弄清楚了。解决方案是改变我的循环迭代的工作方式和更好地理解使用多索引的索引,这实际上只是涉及到玩弄直到它工作。Pandas MultiIndex 文档

我将循环从我的问题更改为:

for i,frame in df.groupby("ID No"):

现在,这给了我与给定 ID 号相关的系列部分(如果我愿意,我也可以使用时间)。然后我可以使用以下方法访问给定的变量(本例中为“A”):

frame[:,:,'A'].iloc[0]

最终的 iloc[0] 是必需的,因为否则我只会得到包含我所有数据帧的系列的一部分。我需要 .iloc[0] 来实际获取存储的数据帧。


推荐阅读