我想获得多索引数据帧的两个级别,因此我可以基于此重新索引数据帧。
采用数据框:
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])
等。
这可能吗?感谢。
答案 0 :(得分:1)
>>> df2.index.tolist()
[(2007, '1'),
(2007, '2'),
(2007, '3'),
(2007, '4'),
(2008, '1'),
(2008, '2'),
(2008, '3'),
(2008, '4'),
...
]