【问题标题】:Cumulative Sum of Grouped Strings in PandasPandas 中分组字符串的累积和
【发布时间】: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://stackoverflow.com/a/39623235/5143841 https://stackoverflow.com/a/22651188/5143841

但我不能完全到达那里。

【问题讨论】:

    标签: python pandas cumsum


    【解决方案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 年)。我现在编辑了!
    猜你喜欢
    • 2018-05-30
    • 2018-09-02
    • 2016-05-06
    • 2021-10-28
    • 2019-02-15
    • 2014-07-13
    • 1970-01-01
    • 2019-10-29
    • 2019-05-04
    相关资源
    最近更新 更多