如何在熊猫中选择一个关卡和所有子关卡(和物品)?

时间:2019-01-10 13:37:17

标签: python pandas

我有一个多级dataframe

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 type (int64)并制成一个单独的数据框。

我尝试过:

df[2017]

我得到一个key error

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

这使我获得所有公开价格。

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

df.loc[pd.IndexSlice['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

如果还有另一个级别,我将如何访问两个级别的数据?

谢谢

2 个答案:

答案 0 :(得分:2)

您要创建索引,所以需要loc

df = df.loc[2018]

或使用DataFrame.xs

df = df.xs(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

答案 1 :(得分:1)

您还可以将ilocget_level_values一起使用:

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

或使用transpose来访问多个级别:

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']]