【问题标题】:Getting the keys out of a Multiindex?从 Multiindex 中获取密钥?
【发布时间】:2016-10-11 09:06:20
【问题描述】:

我有一个带有 ID 和日期的 MultiIndex,格式如下:

MultiIndex(levels=[[196003, 196005, 196007, 196009, 196012, 196103, 196105, 196107, 196109, 196112, 196203, 196205, 196207, 196209, 196212, 196303, 196305, 196307, 196309, 196312, 196403, 196405, 196407, 196409, 196412, 201705, 201707, 201709, 201712, 201803, 201805, 201807, 201809, 201812], ['1959-07-01', '1959-07-02', '1959-07-06', '1959-07-07', '1959-07-08', '1959-07-09', '1959-07-10', '1959-07-13', '1959-07-14', '1959-07-15', '1959-07-16', '1959-07-17', '1959-07-20', '1959-07-21', '1959-07-22', '1959-07-23', ...]])

ID 和日期都需要唯一指定行。

我要做的是提取第一级索引。

当我执行df.index[0] 时,我得到一个(196003, '1959-07-01') 形式的元组

我想要的是一系列 [196003, 196005, ...] 形式的键,用于级别 0。

我设法得到它:

list(df[~df['ID'].duplicated()]['ID'].sort_values().reset_index()['ID'])

但我认为这是一个混乱且缓慢的解决方案。

什么是熊猫方式?

【问题讨论】:

    标签: python-3.x pandas dataframe multi-index levels


    【解决方案1】:

    我认为您可以将get_level_valuesunique 一起使用:

    import pandas as pd
    
    df = pd.DataFrame({'ID':[1,1,3],
                       'Dates':['2015-01-01','2015-01-01','2015-02-01'],
                       'C':[7,8,9]})
    df['Dates'] = pd.to_datetime(df.Dates)
    df.set_index(['ID', 'Dates'], inplace=True)
    print (df)
                   C
    ID Dates        
    1  2015-01-01  7
       2015-01-01  8
    3  2015-02-01  9
    
    print (df.index.get_level_values('ID').unique().tolist())
    [1, 3]
    
    #another a bit slowier solution
    print (df.index.get_level_values('ID').drop_duplicates().tolist())
    [1, 3]
    

    时间安排

    In [134]: %timeit (orig(df1))
    1000 loops, best of 3: 1.54 ms per loop
    
    In [138]: %timeit (df.index.get_level_values('ID').unique().tolist())
    10000 loops, best of 3: 131 µs per loop
    
    In [139]: %timeit (df.index.get_level_values('ID').drop_duplicates().tolist())
    10000 loops, best of 3: 182 µs per loop
    

    计时码

    len(df) = 3k:

    import pandas as pd
    
    df = pd.DataFrame({'ID':[1,1,3],
                       'Dates':['2015-01-01','2015-01-01','2015-02-01'],
                       'C':[7,8,9]})
    df = pd.concat([df]*1000).reset_index(drop=True)
    df['Dates'] = pd.to_datetime(df.Dates)
    df.set_index(['ID', 'Dates'], inplace=True)
    print (df)
    
    
    df1 = df.copy()
    df1.reset_index('ID', inplace=True)
    
    def orig(df):
    
        return list(df[~df['ID'].duplicated()]['ID'].sort_values().reset_index()['ID'])
    
    print (df.index.get_level_values('ID').unique().tolist())
    
    print (orig(df1))
    
    print (df.index.get_level_values('ID').drop_duplicates().tolist())
    

    【讨论】:

    • 哇!多么快!
    • 谢谢,太好了!
    • 很高兴能帮到你!
    猜你喜欢
    • 2018-02-08
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多