2016-02-11 35 views
1

我想了解使用pandas在Python 2.7中複製以下Stata命令的最簡潔的方法: egen yr_id_sum = total(var_to_sum), missing by(id year)在Pandas中按年份和ID求和

我想在這個表產生yr_id_sum柱:

id year value yr_id_sum 
1  2010 1  3 
1  2010 2  3 
1  2011 3  7 
1  2011 4  7 
2  2010 11  23 
2  2010 12  23 
2  2011 13  27 
2  2011 14  27 

我可以爲一個分組變量,如下所示(這可能有助於澄清什麼,我試圖做)這樣做:

def add_mean(grp): 
    grp['ann_sum'] = grp['var_to_sum'].sum() 
    return grp 

df=df.groupby('year').apply(add_sum) 

這相當於egen year_sum = total(var_to_sum), missing by(year)

我在擴大如this有關使用多重索引和我的情況下的答案有困難。

df.set_index(['year', 'id'], inplace=True) 
df=df.groupby(['year', 'id').apply(add_sum) 

好像它應該做什麼,我也想......但我得到Exception: cannot handle a non-unique multi-index!

這裏有一些問題的答案,我已經看過:

+0

已添加數據,感謝您的提示。 –

回答

5

要重現您想要的輸出,您可以使用transform:它採用groupby操作的結果並將其廣播回原始索引。例如:

>>> df["yr_id_sum"] = df.groupby(["id", "year"])["value"].transform(sum) 
>>> df 
    id year value yr_id_sum 
0 1 2010  1   3 
1 1 2010  2   3 
2 1 2011  3   7 
3 1 2011  4   7 
4 2 2010  11   23 
5 2 2010  12   23 
6 2 2011  13   27 
7 2 2011  14   27 

這基本上是

>>> df.groupby(["id", "year"])["value"].sum() 
id year 
1 2010  3 
    2011  7 
2 2010 23 
    2011 27 
Name: value, dtype: int64 

但反覆以匹配被用作索引的原始列。

+0

太棒了!這工作完美。我一直在爲如何處理這個錯誤而苦惱,因爲重複正是我想要總結的。一旦我有足夠的聲望,我會立即給你一個贊成票。 –