Pandas 中分组字符串的累积和

Posted

技术标签:

【中文标题】Pandas 中分组字符串的累积和【英文标题】:Cumulative Sum of Grouped Strings in Pandas 【发布时间】:2021-06-15 06:10:47 【问题描述】:

我有一个 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://***.com/a/39623235/5143841 https://***.com/a/22651188/5143841

但我不能完全到达那里。

【问题讨论】:

【参考方案1】:

我的弗兰肯斯坦博士回答

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 年)。我现在编辑了!

以上是关于Pandas 中分组字符串的累积和的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark数据框中找到没有分组的累积频率

Pandas 按子字符串或正则表达式分组

使用分类字符串对 pandas 数据框进行分组

Pandas groupby:如何按字符串的指定部分分组

Pandas分组时字符串列合并的方法

Pandas分组统计与时间序列