根据组创建新的pandas数据帧

时间:2017-07-04 02:20:27

标签: python pandas

csv(下面的示例)显示给定周(week_end_date)的项目的绝对误差。正如csv所示,一个项目属于一个部门,一个部门有多个项目: enter image description here

我想要做的是创建一个包含以下字段的新数据框:

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成为索引,而我希望它是新数据框中的一个字段,以便我可以在绘图时使用它。有人可以帮助我吗?

2 个答案:

答案 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