从pandas DataFrame MultiIndex中选择命名的索引级别

时间:2018-08-20 01:18:05

标签: python pandas dataframe indexing multi-index

我创建的数据框为:

df1 = pandas.read_csv(ifile_name,  header=None,  sep=r"\s+",  usecols=[0,1,2,3,4],
                              index_col=[0,1,2], names=["year", "month", "day", "something1", "something2"])

现在,我想在year> 2008处创建另一个数据框。因此,我尝试了:

df2 = df1[df1.year>2008]

但是出现错误:

AttributeError: 'DataFrame' object has no attribute 'year'

我猜想,因为我在索引中定义了它,所以在列之间看不到“年”。但是在那种情况下,如何获取基于> 2008年的数据?

3 个答案:

答案 0 :(得分:6)

使用MultiIndex.get_level_values通过名称获取级别,并为选择行创建布尔掩码:

df2 = df1[df1.index.get_level_values('year') > 2008]

如果您打算进行修改,请创建df1的副本,以免在视图上进行操作。

df2 = df1[df1.index.get_level_values('year') > 2008].copy()

答案 1 :(得分:3)

您正确的认为year是索引而不是列。一种解决方案是使用pd.DataFrame.query,它使您可以直接使用索引名称:

df = pd.DataFrame({'year': [2005, 2010, 2015], 'value': [1, 2, 3]})
df = df.set_index('year')

res = df.query('year > 2008')

print(res)

      value
year       
2010      2
2015      3

答案 2 :(得分:3)

假设您的索引已排序

df.loc[2008:]
Out[259]: 
      value
year       
2010      2
2015      3