【问题标题】:Pandas multiindex: get level values without duplicatesPandas multiindex:获取没有重复的级别值
【发布时间】:2018-11-18 19:56:33
【问题描述】:

所以我确信这很简单,但我对 python/pandas 还是很陌生。

我想获取我的 Multiindex 的某个列(我的测量值的名称)作为列表,以便稍后在 for 循环中使用它来命名和保存我的图。我非常有信心从我的数据框中获取我需要的数据,但我不知道如何从我的索引中获取某些列。

所以实际上在写这个问题时,我想出了答案,但它似乎仍然有点笨拙。必须有一个直接的命令才能做到这一点。 那将是我的代码:

a = df.index.get_level_values('File')
a = a.drop_duplicates()
a = a.values

【问题讨论】:

    标签: python pandas dataframe indexing multi-index


    【解决方案1】:

    index.levels

    您可以直接访问MultiIndex 的每个级别的独特元素:

    df = pd.DataFrame([['A', 'W', 1], ['B', 'X', 2], ['C', 'Y', 3],
                       ['D', 'X', 4], ['E', 'Y', 5]])
    df = df.set_index([0, 1])
    
    a = df.index.levels[1]
    
    print(a)
    Index(['W', 'X', 'Y'], dtype='object', name=1)
    

    要了解可用信息,请查看Index 对象在内部的存储方式:

    print(df.index)
    
    MultiIndex(levels=[['A', 'B', 'C', 'D', 'E'], ['W', 'X', 'Y']],
               labels=[[0, 1, 2, 3, 4], [0, 1, 2, 1, 2]],
               names=[0, 1])
    

    但是,以下方法更直观且文档更完善。

    值得注意的一点是,您不必通过 values 属性显式提取 NumPy 数组。您可以直接迭代 Index 对象。此外,Pandas 支持并鼓励方法链接。

    drop_duplicates / 唯一

    返回一个Index 对象,并保留顺序。

    a = df.index.get_level_values(1).drop_duplicates()
    # equivalently, df.index.get_level_values(1).unique()
    
    print(a)
    Index(['W', 'X', 'Y'], dtype='object', name=1)
    

    设置

    返回set。对 O(1) 查找有用,但结果是无序的。

    a = set(df.index.get_level_values(1))
    
    print(a)
    {'X', 'Y', 'W'}
    

    【讨论】:

    • 啊,上面那个简单的例子让我更清楚索引是如何形成的!
    • df.index.levels[1] 很有用,但它不会保持该索引级别中项目的顺序(!)
    猜你喜欢
    • 2021-07-05
    • 2014-08-21
    • 2020-02-14
    • 2017-01-22
    • 2020-05-19
    • 2023-03-10
    • 2019-11-19
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多