我一直在研究Pandas Dataframe,但是在检索更高级别索引的sub_level索引时遇到了问题。
此图显示了我的数据框结构:
例如,在上图中,我想检索仅对“设备+标签”键“ -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'] 的结果:
它不起作用,这不是逻辑,因为我认为 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
答案 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)