2016-05-03 2 views
0

Я хочу получить оба уровня мультииндекса данных, чтобы я мог повторно индексировать фреймворк данных на основе этого.Получение обоих уровней мультииндекса для повторной индексации фрейма данных

Возьмите dataframe:

import pandas as pd 
import numpy as np 

dates = pd.date_range('20070101',periods=3200) 
df = pd.DataFrame(data=np.random.randint(0,100,(3200,1)), columns =list('A')) 
df['date'] = dates 
df = df[['date','A']] 

Применить функцию сезона к индексу даты и времени

def get_season(row): 
    if row['date'].month >= 3 and row['date'].month <= 5: 
     return '2' 
    elif row['date'].month >= 6 and row['date'].month <= 8: 
     return '3' 
    elif row['date'].month >= 9 and row['date'].month <= 11: 
     return '4' 
    else: 
     return '1' 

Применить функцию

df['Season'] = df.apply(get_season, axis=1) 

Создать столбец 'Year' для индексации

df['Year'] = df['date'].dt.year 

Multi-индекс по годам и сезон

df = df.set_index(['Year', 'Season'], inplace=False) 

Группа данные

df2 = df['A'].groupby(level=['Year','Season']).mean() 

Когда я запрашиваю это на первом уровне:

df2.index.get_level_values(0) 

Я получаю лет:

Out[4]: 
Int64Index([2007, 2007, 2007, 2007, 2008, 2008, 2008, 2008, 2009, 2009, 2009, 
     2009, 2010, 2010, 2010, 2010, 2011, 2011, 2011, 2011, 2012, 2012, 
     2012, 2012, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2015, 
     2015, 2015, 2015], 
     dtype='int64', name=u'Year') 

и второй уровень:

df2.index.get_level_values(1) 

Я получаю сезоны:

Out[6]: 
Index([u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4', 
    u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4', 
    u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4', u'1', u'2', u'3', u'4'], 
    dtype='object', name=u'Season') 

Но я хочу оба года и сезоны связаны с Афоризм - так что я могу повторно указателю dataframe на основе как год и сезон, оба уровня мультииндекс.

То есть - я хочу ([2007;1 , 2007;2 , 2007;3]) и т.д.

Возможно ли это сделать? Благодарю.

ответ

1
>>> df2.index.tolist() 
[(2007, '1'), 
(2007, '2'), 
(2007, '3'), 
(2007, '4'), 
(2008, '1'), 
(2008, '2'), 
(2008, '3'), 
(2008, '4'), 
... 
] 
+0

Это работает, но когда я пытаюсь переиндексации в dataframe с помощью этого: 'df3.reindex (NewIndex)' дает ошибку 'Exception: (спасибо!)! Не может справиться с неединственным мультииндексом' - это вероятно, является отдельным вопросом ... – Pad

+0

Ах - получил его 'df.loc [newindex]' – Pad

Смежные вопросы