Pandas中按组累计求和字符串。

3

我有一个pandas数据框,想通过两个列分组,然后返回一个字符串的第三列的累计和作为其中一组内的列表。

例子:

Year  Bucket  Name
2000    1      A
2001    1      B
2003    1      C
2000    2      B
2002    2      C

我想要的输出是:
Year  Bucket  Cum_Sum
2000    1      [A]
2001    1      [A,B]
2002    1      [A,B]
2003    1      [A,B,C]
2000    2      [B]
2001    2      [B]
2002    2      [B,C]
2003    2      [B,C]

我试图从两个回答中拼凑出一个答案:

https://dev59.com/55rga4cB1Zd3GeqPuvZ-#39623235 https://dev59.com/qWEh5IYBdhLWcg3wPRSq#22651188

但是我还没有完全理解。

1个回答

4

我的弗兰肯斯坦博士答案

dat = []
rng = range(df.Year.min(), df.Year.max() + 1)
for b, d in df.groupby('Bucket'):
    for y in rng:
        dat.append([y, b, [*d.Name[d.Year <= y]]])
        
pd.DataFrame(dat, columns=[*df])

   Year  Bucket       Name
0  2000       1        [A]
1  2001       1     [A, B]
2  2002       1     [A, B]
3  2003       1  [A, B, C]
4  2000       2        [B]
5  2001       2        [B]
6  2002       2     [B, C]
7  2003       2     [B, C]

另一个奇怪的答案

rng = range(df.Year.min(), df.Year.max() + 1)
i = [(y, b) for b, d in df.groupby('Bucket') for y in rng]
s = df.set_index(['Year', 'Bucket']).Name.map(lambda x: [x])
s.reindex(i, fill_value=[]).groupby(level=1).apply(pd.Series.cumsum).reset_index()

   Year  Bucket       Name
0  2000       1        [A]
1  2001       1     [A, B]
2  2002       1     [A, B]
3  2003       1  [A, B, C]
4  2000       2        [B]
5  2001       2        [B]
6  2002       2     [B, C]
7  2003       2     [B, C]

谢谢,我不介意把这个拼凑起来!请注意,在我的原始帖子中,我不必要地要求输出一个不平衡的面板(即桶1的年份最高到2003年,桶2的年份最高到2002年)。我现在已经编辑过了! - JBN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接