按年计算并在熊猫中识别

时间:2016-02-11 00:59:06

标签: python pandas

我想了解使用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!

以下是我已经看过的一些答案:

1 个答案:

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

但重复以匹配用作索引的原始列。