我想了解使用pandas在Python 2.7中复制以下Stata命令的最紧凑方法:
egen yr_id_sum = total(var_to_sum), missing by(id year)
。
我想在此表中生成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 :(得分:6)
要重现所需的输出,可以使用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
但重复以匹配用作索引的原始列。