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

4

我创建了一个数据框,如下所示:

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个回答

7
使用MultiIndex.get_level_values通过名称获取级别,并创建行选择的布尔掩码:
df2 = df1[df1.index.get_level_values('year') > 2008]

如果您计划进行修改,请创建 df1 的副本,以免对视图进行操作。

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

对视图df2进行修改会以任何方式影响原始的df1吗?如果不会,为什么要复制一份呢?谢谢。 - undefined

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

3
假设您的索引已经排序:
df.loc[2008:]
Out[259]: 
      value
year       
2010      2
2015      3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接