csv(下面的示例)显示给定周(week_end_date)的项目的绝对误差。正如csv所示,一个项目属于一个部门,一个部门有多个项目:
我想要做的是创建一个包含以下字段的新数据框:
mdse_dept_ref_i week_end_date average_ABSError num_items_in_department
以下是我能够做到的事情:
new_df = df.loc[df['mdse_dept_ref_i'] == 47]
num_items = new_df.groupby('week_end_date').size()
avg_abs_error = new_df.groupby(['week_end_date'])['ABSError'].mean()
new_df = num_items.to_frame().join(avg_abs_error.to_frame())
但是,我不知道如何自动为所有部门创建单个数据帧,因为最终我想知道部门中的项目数量如何影响平均错误,并且能够看到表现最差的部门。此外,当我执行groupby('week_end_date')
时,week_end_date
成为索引,而我希望它是新数据框中的一个字段,以便我可以在绘图时使用它。有人可以帮助我吗?
答案 0 :(得分:0)
Pandas'groupby允许您按多个字段分组:
g = df.groupby(['mdse_dept_ref_i','week_end_date'])
num_items = g.size().to_frame('num_items')
avg_abs_error = g['ABSError'].mean()
df0 = pd.concat((num_items,avg_abs_error), axis = 1).reset_index()
df.merge(df0)
您实际上可以将参数as_index = False
传递给.groupby
,但这在使用.size()
时无效,因此我们必须稍后重置索引。
答案 1 :(得分:0)
我认为您需要groupby
+ agg
,然后是rename
列,最后join
需要原始df
:
df1 = df.groupby(['mdse_dept_ref_i','week_end_date'])['ABSError'].agg(['size','mean'])
d = {'size':'total', 'mean':'ABSError mean'}
df1 = df1.rename(columns=d)
print (df1)
total ABSError mean
mdse_dept_ref_i week_end_date
47 3/25/17 3 39.988728
80 3/25/17 1 1.791748
204 3/25/17 1 12975.863000
df = df.join(df1, on=['mdse_dept_ref_i','week_end_date'])
print (df)
mdse_item_i mdse_clas_i mdse_dept_ref_i actual_sls week_end_date \
0 19084539 30 47 0 3/25/17
1 19517957 43 47 3 3/25/17
2 19378250 0 204 1644 3/25/17
3 19704764 43 47 0 3/25/17
4 19119951 8 80 17 3/25/17
rnn_fcst_sls forecast_release_date ABSError total ABSError mean
0 48.520298 3/31/17 48.520298 3 39.988728
1 44.795605 3/31/17 41.795605 3 39.988728
2 14619.863000 3/31/17 12975.863000 1 12975.863000
3 29.650280 3/31/17 29.650280 3 39.988728
4 18.791748 3/31/17 1.791748 1 1.791748