У меня есть многоуровневый 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
Я пытаюсь выбрать type (int64)
2018
type (int64)
и 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
Кроме того, если бы существовал другой уровень, как бы мне получить доступ к двум уровням данных?
Спасибо
Вы хотите выбрать индекс, поэтому нужно 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
вы также можете использовать 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']]