Python Многоуровневый индекс на фрейме данных. Доступ к первой строке первого уровня индекса для применения функции - PullRequest
1 голос
/ 17 февраля 2020

У меня есть многоуровневый индексный фрейм данных. Индекс уровня 1 содержит уникальный ключ, индекс уровня 2 содержит дату для индекса уровня 1.

Код:

import pandas as pd
from dateutil.relativedelta import relativedelta
from datetime import datetime

fake_data=pd.DataFrame([(x,pd.to_datetime('04/01/2020')+relativedelta(months=y)) for x in list(range(0,11)) for y in list(range(0,11))],columns=['x','y'])
fake_data['z']=fake_data['x']*np.random.uniform(low=1,high=1000)
fake_data.set_index(['x','y'],drop=True,inplace=True)

Желаемый результат заключается в том, что для начала индекса уровня 1 ( groupby) и назначить новую переменную для кадра данных, который содержит квартал, основанный на значениях в индексе второго уровня. Как я могу конкретно получить доступ к индексу уровня 1 группы и применить функцию , которая оценивает индекс уровня 2 для генерации квартала?

На изображении желательна панель RIGHT результат из кадра данных.

Желаемые результаты

1 Ответ

1 голос
/ 17 февраля 2020

Используйте MultiIndex.get_level_values для извлечения второго уровня и добавьте DatetimeIndex.quarter:

fake_data['qtr'] = fake_data.index.get_level_values(1).quarter
print (fake_data.head(20))
                       z  qtr
x y                          
0 2020-04-01    0.000000    2
  2020-05-01    0.000000    2
  2020-06-01    0.000000    2
  2020-07-01    0.000000    3
  2020-08-01    0.000000    3
  2020-09-01    0.000000    3
  2020-10-01    0.000000    4
  2020-11-01    0.000000    4
  2020-12-01    0.000000    4
  2021-01-01    0.000000    1
  2021-02-01    0.000000    1
1 2020-04-01  983.538088    2
  2020-05-01  983.538088    2
  2020-06-01  983.538088    2
  2020-07-01  983.538088    3
  2020-08-01  983.538088    3
  2020-09-01  983.538088    3
  2020-10-01  983.538088    4
  2020-11-01  983.538088    4
  2020-12-01  983.538088    4

Если хотите всегда начинать с 0, добавьте factorize:

fake_data['qtr'] = pd.factorize(fake_data.index.get_level_values(1).quarter)[0]
print (fake_data.head(20))
                      z  qtr
x y                         
0 2020-04-01   0.000000    0
  2020-05-01   0.000000    0
  2020-06-01   0.000000    0
  2020-07-01   0.000000    1
  2020-08-01   0.000000    1
  2020-09-01   0.000000    1
  2020-10-01   0.000000    2
  2020-11-01   0.000000    2
  2020-12-01   0.000000    2
  2021-01-01   0.000000    3
  2021-02-01   0.000000    3
1 2020-04-01  80.286425    0
  2020-05-01  80.286425    0
  2020-06-01  80.286425    0
  2020-07-01  80.286425    1
  2020-08-01  80.286425    1
  2020-09-01  80.286425    1
  2020-10-01  80.286425    2
  2020-11-01  80.286425    2
  2020-12-01  80.286425    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...