python支持多索引数据帧,如何基于iloc选择一个级别

python支持多索引数据帧,如何基于iloc选择一个级别,python,pandas,Python,Pandas,在旧版本中,这将返回一个面板,因此现有代码使用 df = pd.DataFrame(np.random.rand(100, 2), columns=pd.Index(['A', 'B'], name='bar'), index=pd.date_range('20160101', periods=100, freq='D', name='foo')) corr = df.rolling(12).corr() 返回第一个日期的corr矩阵 然而,在新版本中,corr是一个多索引数

在旧版本中,这将返回一个面板,因此现有代码使用

df = pd.DataFrame(np.random.rand(100, 2),
    columns=pd.Index(['A', 'B'], name='bar'),
    index=pd.date_range('20160101',
periods=100, freq='D', name='foo'))

corr = df.rolling(12).corr()
返回第一个日期的corr矩阵

然而,在新版本中,corr是一个多索引数据帧,上述代码失败。如何以最小的更改实现相同的输出

corr[0,:,:]
编辑:

所需的输出是获得与下面相同的返回值,但不是将
.loc
与值一起使用,而是使用类似
.iloc[11]
(即与日期中第12个值对应的相关矩阵)

这就是你想要的吗

corr.loc['2016-01-12']

bar                    A         B
foo        bar                    
2016-01-12 A    1.000000 -0.115059
           B   -0.115059  1.000000

@MaxU提到的问题是,
.iloc
不是“多索引感知的”——请参阅以获取讨论

针对您的案例的替代解决方案:

In [236]: x = corr.dropna()

In [237]: x.loc[pd.IndexSlice[x.index[0][0], :], :]
Out[237]:
bar                    A         B
foo        bar
2016-01-12 A    1.000000  0.158424
           B    0.158424  1.000000
要保留为数据帧,请执行以下操作:

dates = corr.index.get_level_values(0).drop_duplicates()
corr.loc[dates[12]]  # correl. matrix for 12th date (0-indexed)
dates = corr.index.get_level_values(0).drop_duplicates()
corr.loc[dates[12]]  # correl. matrix for 12th date (0-indexed)
corr.loc[[dates[12]]]