Как выбрать уровень и все подуровни (и предметы) в пандах?

1

У меня есть многоуровневый 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

Кроме того, если бы существовал другой уровень, как бы мне получить доступ к двум уровням данных?

Спасибо

  • 0
    Пожалуйста, проверьте, пытаетесь ли вы получить доступ к 2017 году, а не к 2018 году.
  • 0
    Благодаря @Lalit, датафрейм больше, и 2018 также находится в индексе. Я сделал опечатку. Здесь, но как ни странно, теперь это работает.
Теги:
pandas

2 ответа

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню