2016-11-18 5 views
2

データセットの特定の列を解析し、マルチインデックスデータフレームを作成する次のコードがあります。PeriodIndexでグループ化した後にインデックスをリセットできません

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

ここで私は私がPeriodIndex上GROUPBYで実装されている四半期(各月のデータセット内の個別の列です)、上の平均値を計算したい出力

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 

です。それは動作しますが、何らかの理由でデータフレームを破損し、私は(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 

私はパンダに非常に新しいです、そしておそらく何か間違ったことをやってもらう、ちょうど私何が分かりません。 私は各四半期の平均を計算したい(3か月ごとの列を組み合わせて)、データフレームをさらに操作できるようにしたい。

EDIT:問題を再現する小さな例があります。

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

はあなたが小さい例でこれを再現することができhttp://danielbreen.net/projects/housing_prices_college_towns/(と、それを私たちに提供)? –

+0

最後に '2000Q1,2000Q2、2000Q3'カラムと' State'と 'RegionName'のない新しいインデックスだけを使いたいですか? – estebanpdl

+0

はい、四半期の列に格納された集計値のみを保持します。私はまたインデックスで柔軟になりたい。後で私はインデックスをリセットし、列としてそれらを使用したいと思うでしょう – Sorantis

答えて

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

を見てみましょう:

関連する問題