Как объединить pandas столбцы индекса в цепочке методов? - PullRequest
1 голос
/ 09 апреля 2020

Я работаю с мультииндексным pandas фреймом данных. Моя цель - объединить два столбца индекса в один, не разбиваясь на цепочку методов.

Пример:

A имеет следующий pandas фрейм данных:

In[1]: df
Out[1]: 
                    value
year type color          
2018 A    red   -0.236022
          blue  -1.030577
     B    red    1.197374
          blue  -0.496247
2019 A    red   -0.066938
          blue   0.087585
     B    red   -1.702598
          blue   0.085282

Теперь я хочу выполнить цепочку методов для этого кадра данных. Где-то в середине этих методов я хочу объединить два столбца индекса в один. Например, я выполняю запрос (тип == A), а затем объединяю два столбца индекса (год и цвет) и затем умножаю (на 4). Все это без разрыва из цепочки:

df2 = df \
  .query('type=="A"') \
  .reset_index('type', drop=True) \
  .combine_indexes(["year", "type"]) \ # <- this is what I'm missing
  .multiply(4)

Требуемый вывод:

In[3]: df2
Out[3]: 

               value
year-color          
2018-red   -0.944089
2018-blue  -4.122310
2019-red   -0.267752
2019-blue   0.350339

В этом примере я создал метод 'Объединить_индексы'. Кто-нибудь знает, есть ли что-то подобное этому? Я знаю, как объединить два столбца индекса, но только если я вырвусь из цепочки. Мне нужно что-то совместимое с цепочкой.

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Без разрыва цепи я бы переместил set_index последний:

(df.query('type=="A"')
   .reset_index('type',drop=True)
   .mul(4)
   .assign(year_color=lambda x: [f'{a}-{b}' for a,b in x.index])
   .set_index('year_color')
)

Вывод (исходные значения np.arange(8))

            value
year_color       
2018-red        0
2018-blue       4
2019-red       16
2019-blue      20
1 голос
/ 09 апреля 2020

На вопрос о том, как объединить уровни индекса, давайте попробуем Index.map:

tmp = df.query('type == "A"').droplevel('type')
# The money line:
tmp.index = tmp.index.map('{0[0]}-{0[1]}'.format)                                                                                              
tmp.index.name = 'year-color'                                                                                                                  

tmp                                                                                                                                            

               value
year-color          
2018-red   -0.236022
2018-blue  -1.030577
2019-red   -0.066938
2019-blue   0.087585
...