我有以下代码解析数据集中的给定列并创建一个多索引数据框。
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()
答案 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/