Python 如何在熊猫中选择一个级别和所有子级别(和项目)?

Python 如何在熊猫中选择一个级别和所有子级别(和项目)?,python,pandas,Python,Pandas,我有一个多级数据帧: year month Open High Low Close 2018 1 25565.75 27379.45 27652.05 25232.80 2 27334.85 25107.40 27613.50 24781.70 3 25022.35 24263.35 25226.05 23605.60 4 24235.65 25531.60 25617.

我有一个多级
数据帧

year month  Open      High      Low       Close
2018 1      25565.75  27379.45  27652.05  25232.80
     2      27334.85  25107.40  27613.50  24781.70
     3      25022.35  24263.35  25226.05  23605.60
     4      24235.65  25531.60  25617.50  24062.95
     5      25607.05  26956.20  27164.55  25469.05
2019 1      27231.40  27720.40  27754.45  26923.75
我正在尝试选择
2018
类型(int64)
,并将其制作成一个单独的数据帧

我试过:

df[2017]

我得到一个
键错误

df.loc[pd.indexlice[0,'Open']]

这让我得到了所有的公开价格

df.loc[pd.indexlice['year':,'Open']]

df.loc[pd.indexlice['2017','Open']]

它们似乎不起作用

如何访问这些级别?记住它们是int64类型的吗

预期产出:

     month  Open      High      Low       Close
     1      25565.75  27379.45  27652.05  25232.80
     2      27334.85  25107.40  27613.50  24781.70
     3      25022.35  24263.35  25226.05  23605.60
     4      24235.65  25531.60  25617.50  24062.95
     5      25607.05  26956.20  27164.55  25469.05
如果还有另一个级别,我将如何访问两个级别的数据


谢谢

您需要seelct索引,因此需要
loc

df = df.loc[2018]
或使用:

或者,如果需要,选择第二级中的所有值需要

df = df.loc[pd.IndexSlice[2018,:]]
print (df)
           Open      High       Low     Close
month                                        
1      25565.75  27379.45  27652.05  25232.80
2      27334.85  25107.40  27613.50  24781.70
3      25022.35  24263.35  25226.05  23605.60
4      24235.65  25531.60  25617.50  24062.95
5      25607.05  26956.20  27164.55  25469.05

您还可以将
iloc
get\u level\u值一起使用:

2018_df = df.iloc[df.index.get_level_values('year') == 2018].reset_index(level=0, drop=True)

       Open        High       Low        Close
month               
1   25565.75    27379.45    27652.05    25232.80
2   27334.85    25107.40    27613.50    24781.70
3   25022.35    24263.35    25226.05    23605.60
4   24235.65    25531.60    25617.50    24062.95
5   25607.05    26956.20    27164.55    25469.05
或者,如果要访问其他级别:

month_1_df = df.iloc[df.index.get_level_values('month') == 1].reset_index(level=1, drop=True)

           Open        High         Low        Close
year                
2018    25565.75    27379.45    27652.05    25232.80
2019    27231.40    27720.40    27754.45    26923.75
或者要访问多个级别,请使用
转置

df.T.loc[:, (2018, 3)].to_frame().T

             Open         High        Low        Close
2018    3   25022.35    24263.35    25226.05    23605.6

现在,您可以选择您想要的任何列:
df.T.loc[:,(2018,3)]。to_frame().T['Open',Close']

请交叉检查您试图访问的是2017而不是2018。谢谢@Lalit,datframe更大,2018也在索引中。我打错了。在这里,但奇怪的是,它现在起作用了。
df.T.loc[:, (2018, 3)].to_frame().T

             Open         High        Low        Close
2018    3   25022.35    24263.35    25226.05    23605.6