2017-07-04 98 views
2

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

但是,我不知道如何为各部门建立一个单一的数据框自动做到这一点,因为最终我想看看如何在项目数部门正在影响AV erage错误,也能够看到表现最差的部门。此外,当我执行groupby('week_end_date')时,week_end_date将成为索引,但我希望它是新数据框中的字段,以便在绘图时使用它。有人可以帮帮我吗?

+1

什么是 “一些绘图” 的意思是,到底是什么? –

+0

你的问题不是很清楚。你可以举一些你想要的数据格式的例子吗? – Jacobm001

+0

@MadPhysicist:请参阅更新后的问题 – user1274878

回答

0

大熊猫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()时没有任何影响,所以我们必须重置稍后索引。

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