如何在Pandas DataFrame中获得更高级别索引的sub_level索引?

时间:2019-06-24 09:38:01

标签: python pandas dataframe jupyter-notebook jupyter

我一直在研究Pandas Dataframe,但是在检索更高级别索引的sub_level索引时遇到了问题。

此图显示了我的数据框结构:

This image shows my Dataframe structure

例如,在上图中,我想检索仅对“设备+标签”键“ -444/0”存在的“ DCSID”索引,即“ -111111”,“-222222”和“ -333333”。

我考虑使用 df.loc ['-444/0']。index.levels [0] ,因为 df.loc [ '-444/0'] 返回键“ -444/0”的子数据帧,并使用 index.levels [0] 以后检索我想要的结果。

这是执行 df.loc ['-444/0'] 的结果:

This is the result of doing ***df.loc['-444/0']***

它不起作用,这不是逻辑,因为我认为 df.loc ['-444/0'] 返回一个新的数据框。

无论如何,我发现 df.index.levels [1] 等同于 df.iloc ['-444/0' ] .index.levels [0] 均返回“ DCSID”中所有索引的列表:

  

Int64Index([-444444,-333333,-305500,-304445,-301064,-300015,-299069,               -297188,-296241,-295295,               ...                -17132,-15622,-14112,-12602,-9596,-8086,-6576,                 -5066,-2060,-542],              dtype ='int64',名称='DCSID',长度= 120)

这是我的代码的一部分:

for i in df.index.levels[0]: #Choose from first level
    for j in df.loc[i].index.levels[0]: #Choose from second level going through the i-th first level
        for k in df.loc[i, j, slice(None)].index: #Choose from third level going through the j-th second level
            #Code here

2 个答案:

答案 0 :(得分:0)

我正在使用您的csv文件列,您可以根据需要更改列名称

使用get_values应用过滤器,并在isin列表中提供DSCID或equipmentKey

df = df[(df.index.get_level_values('EquipmentKey').isin(['-444']))]
df.reset_index(inplace=True)
unique_dscid = df['DSCID'].unique()

第二种方式:

df.reset_index(inplace=True)
df = df[(df['EquipmentKey']=='-444')]
unique_dscid =df['DSCID'].unique()

答案 1 :(得分:0)

MultiIndex是奇怪的动物。如果您真的想从中获取价值,请以reset_index开头:

df.loc['-444/0'].reset_index()['DCSID'].unique()

应给出预期的结果array([-111111, -222222, -333333, -444444], dtype=int64)