【问题标题】:pandas multiindex selection with ranges带有范围的熊猫多索引选择
【发布时间】:2015-01-20 04:24:55
【问题描述】:

我有一个类似的 python 框架

 y m     A     B
1990  1  3.4   5
      2  4     4.9
 ...
1990 12  4.0   4.5
 ...
2000  1  2.3   8.1 
      2  3.7   5.0
 ...
2000 12  2.4   9.1

我想从第二个索引 (m) 和 1991-2000 年中选择 2-12。我似乎没有得到正确的多索引切片。例如。我试过了

idx = pd.IndexSlice
dfa = df.loc[idx[1:,1:],:]

但这似乎并没有在第一个索引上切片。对优雅的解决方案有何建议?

干杯,迈克

【问题讨论】:

    标签: pandas dataframe slice


    【解决方案1】:

    如果没有示例代码来重现您的 df,则很难猜测,但如果您的 df 类似于:

    import pandas as pd
    df = pd.read_csv(pd.io.common.StringIO(""" y m     A     B
    1990  1  3.4   5
    1990  2  4     4.9
    1990 12  4.0   4.5
    2000  1  2.3   8.1 
    2000  2  3.7   5.0
    2000 12  2.4   9.1"""), sep='\s+')
    
    df
    
          y   m    A    B
    0  1990   1  3.4  5.0
    1  1990   2  4.0  4.9
    2  1990  12  4.0  4.5
    3  2000   1  2.3  8.1
    4  2000   2  3.7  5.0
    5  2000  12  2.4  9.1
    

    然后这段代码将提取你需要的内容:

    print df.loc[(df['y'].isin(range(1990,2001))) & df['m'].isin(range(2,12))]
    
          y  m    A    B
    1  1990  2  4.0  4.9
    4  2000  2  3.7  5.0
    

    如果您的dfym 的索引,那么这将执行相同的操作:

    df.set_index(['y','m'],inplace=True)
    years = df.index.get_level_values(0).isin(range(1990,2001))
    months = df.index.get_level_values(1).isin(range(2,12))
    df.loc[years & months]
    
          y  m    A    B
    1  1990  2  4.0  4.9
    4  2000  2  3.7  5.0
    

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2020-02-04
      • 2014-08-12
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多