基于组创建新的数据帧

2024-09-29 21:37:27 发布

您现在位置:Python中文网/ 问答频道 /正文

csv(下面的示例)显示给定星期(星期结束日期)内项目的绝对误差。如csv所示,一个项目属于一个部门,而一个部门有多个项目: enter image description here

我要做的是创建一个新的dataframe,它包含以下字段:

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成为一个索引,而我希望它成为新数据帧中的一个字段,以便在打印时使用它。有人能帮我吗?你知道吗


Tags: csv项目refdfnewdateitemsnum
2条回答

我认为您需要^{}+^{},然后rename列和最后^{}到原始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  

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()时没有效果,因此我们必须稍后重置索引。你知道吗

相关问题 更多 >

    热门问题