Python 基于索引删除,而不知道索引在哪里

Python 基于索引删除,而不知道索引在哪里,python,pandas,Python,Pandas,假设我有一个pandas.DataFrame和一个multi-index,我知道它有两个级别,year在第一个级别,我想保留特定的年份,我可以这样做 df = df.loc[yearStart:, :] df = df.loc[df.year >= yearStart] 如果我知道该指数只有两个级别,但不知道年份是哪一个级别,我可以破解一些肮脏的代码 if df.index.names[0] == 'year': df = df.loc[yearStart:, :] else

假设我有一个
pandas.DataFrame
和一个
multi-index
,我知道它有两个级别,
year
在第一个级别,我想保留特定的年份,我可以这样做

df = df.loc[yearStart:, :]
df = df.loc[df.year >= yearStart]
如果我知道该指数只有两个级别,但不知道
年份是哪一个级别,我可以破解一些肮脏的代码

if df.index.names[0] == 'year':
    df = df.loc[yearStart:, :]
else
    df = df.loc[:, yearStart:]
如果我知道它在索引中,但不知道它在哪个级别,也不知道索引有多少级别,该怎么办?如果
year
不在索引中,而是在常规列中,我可以这样做

df = df.loc[yearStart:, :]
df = df.loc[df.year >= yearStart]

索引是否有类似的通用属性?

您可以使用
获取索引级别的列视图

df = pd.DataFrame({'a': range(100)}, index=pd.MultiIndex.from_product([range(10), range(2010,2020)], names=['idx1', 'year']))

df.head()
Out[41]: 
           a
idx1 year   
0    2010  0
     2011  1
     2012  2
     2013  3
     2014  4

df[df.index.get_level_values('year') >= 2015].head()
Out[42]: 
           a
idx1 year   
0    2015  5
     2016  6
     2017  7
     2018  8
     2019  9

您可以使用
get\u level\u values
获取索引级别的类似列的视图

df = pd.DataFrame({'a': range(100)}, index=pd.MultiIndex.from_product([range(10), range(2010,2020)], names=['idx1', 'year']))

df.head()
Out[41]: 
           a
idx1 year   
0    2010  0
     2011  1
     2012  2
     2013  3
     2014  4

df[df.index.get_level_values('year') >= 2015].head()
Out[42]: 
           a
idx1 year   
0    2015  5
     2016  6
     2017  7
     2018  8
     2019  9