按PeriodIndex分组后无法重置索引

时间:2016-11-18 01:08:25

标签: python pandas dataframe

我有以下代码解析数据集中的给定列并创建一个多索引数据框。

dates = pd.date_range("2000-01", "2016-08", freq="MS").format(formatter=lambda x: str(x.strftime('%Y-%m')))
dates.append('State')
dates.append('RegionName')
df = pd.read_csv('City_Zhvi_AllHomes.csv', usecols=dates)
df.set_index(['State', 'RegionName'], inplace=True)
df = df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean()

这是输出

df.head(2)

2000Q1  2000Q2  2000Q3  2000Q4  2001Q1  2001Q2  2001Q3  2001Q4  2002Q1  2002Q2  ... 2014Q2  2014Q3  2014Q4  2015Q1  2015Q2  2015Q3  2015Q4  2016Q1  2016Q2  2016Q3
State   RegionName                                                                                  
NY  New York    NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 515466.666667   522800.000000   528066.666667   532266.666667   540800.000000   557200.000000   572833.333333   582866.666667   591633.333333   587200.0
CA  Los Angeles 207066.666667   214466.666667   220966.666667   226166.666667   233000.0    239100.0    245066.666667   253033.333333   261966.666667   272700.0    ... 498033.333333   509066.666667   518866.666667   528800.000000   538166.666667   547266.666667   557733.333333   566033.333333   577466.666667   584050.0
2 rows × 67 columns

我想计算平均值超过四分之一(每个月是数据集中的一个单独的列),我用groupbydex实现了groupby。它有效,但由于某种原因破坏了数据框架,就好像我尝试df.reset_index(),我得到了这个

pandas/src/generated.pyx in pandas.algos.ensure_int64 (pandas/algos.c:64659)()

pandas/src/generated.pyx in pandas.algos.ensure_int64 (pandas/algos.c:64607)()

ValueError: invalid literal for int() with base 10: 'RegionName'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
pandas/tslib.pyx in pandas.tslib.parse_datetime_string_with_reso (pandas/tslib.c:32198)()

pandas/tslib.pyx in pandas.tslib.dateutil_parse (pandas/tslib.c:34509)()

ValueError: Unknown datetime string format, unable to parse: REGIONNAME

我对熊猫很新,而且很可能做错了什么,我无法弄清楚是什么。 我想计算每个季度的平均值(每三个月合并一列),并能够进一步操纵数据框架。

编辑:这是一个重现问题的小例子。

dates = pd.date_range("2000-01", "2000-09", freq="MS").format(formatter=lambda x: str(x.strftime('%Y-%m')))
dates.append('State')
dates.append('RegionName')
df = pd.DataFrame(np.random.randn(10, 11))
df.columns = dates
df.set_index(['State', 'RegionName'], inplace=True)
df = df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean()
df.reset_index()

1 个答案:

答案 0 :(得分:0)

for year in range(2000,2017):
    for quarter in range(1,5):

        if quarter == 4 and year == 2016:
            break

        new_column_name = '{0}q{1}'.format(year, quarter)
        begin_month = (quarter-1)*3 + 1
        end_month = quarter*3
        begin_column = '{0}-{1:02d}'.format(year,begin_month)
        end_column = '{0}-{1:02d}'.format(year,end_month)

        if quarter == 3 and year == 2016:
            new_column_name = '2016q3'
            begin_month = 6
            end_month = 8
            begin_column = '{0}-{1:02d}'.format(year,begin_month)
            end_column = '{0}-{1:02d}'.format(year,end_month)                

        data = housing_df.loc[:,begin_column:end_column]

        housing_df[new_column_name] = data.mean(axis = 1)
        housing_df['State'] = housing_df['State'].apply(lambda x: states[x])  
        housing_df = housing_df.set_index(['State','RegionName']) 
        ....

看看:http://danielbreen.net/projects/housing_prices_college_towns/