【问题标题】:How can I get sub_level indexes of a higher level index in Pandas DataFrame?如何在 Pandas DataFrame 中获取更高级别索引的子级别索引?
【发布时间】:2019-06-24 09:38:01
【问题描述】:

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

这张图片显示了我的数据框结构:

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

自从 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', name='DCSID', length=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

【问题讨论】:

标签: python pandas dataframe jupyter-notebook jupyter


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    使用 get_values 应用过滤器并在 isin 列表中提供 DSCID 或设备键

    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()
    

    【讨论】:

    • 谢谢先生。我很感激。
    • @MohamedAzizTousli 欢迎您投票,如果您觉得有用,请放弃投票。
    • 我不能。 :/。它说:“感谢您的反馈!声望低于 15 人的投票会被记录下来,但不要更改公开显示的帖子得分。”
    • @MohamedAzizTousli 没问题
    猜你喜欢
    • 2018-07-08
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2019-01-26
    • 2016-09-08
    • 2023-03-10
    • 2022-11-12
    相关资源
    最近更新 更多