获取多索引的两个级别以重新索引数据帧

时间:2016-05-03 16:44:07

标签: python pandas 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)

创建一年&#39;用于索引的列

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

按年份和季节划分的多指数

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

但是我想要彼此相关的年份和季节 - 所以我可以根据年份和季节重新索引数据框,这两个级别都是多指数。

那是 - 我想要([2007;1 , 2007;2 , 2007;3])等。

这可能吗?感谢。

1 个答案:

答案 0 :(得分:1)

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