我有一个多级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
如果还有另一个级别,我将如何访问两个级别的数据?
谢谢
答案 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)
您还可以将iloc
与get_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']]