pandas multiindex选择范围

时间:2014-11-21 22:13:58

标签: pandas dataframe slice

我有像

这样的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:],:]

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

干杯,迈克

1 个答案:

答案 0 :(得分:2)

如果没有示例代码来重现您的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