【问题标题】:Group by aggregate elements so far in the same group - Pandas到目前为止,按同一组中的聚合元素分组 - Pandas
【发布时间】:2021-12-06 01:11:26
【问题描述】:

下面是输出应该是什么样子的示例:

数据框:具有所需输出的 ​​df

class_id    item    req_output
a           1       [1] 
a           2       [1,2]   
a           3       [1,2,3]
b           1       [1] 
b           2       [1,2]

我试过了: df.groupby("class").apply(lambda x: list(x["item"])

class_id    output
a           [1,2,3]
b           [1,2]

但这只会给出整个聚合,但是考虑到类,我需要在每一行中进行聚合

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    首先,将每个元素组成一个大小为 1 的列表。在这里,我们(利用滥用?)事实[1] + [2] = [1, 2]。然后按和GroupBy.applySeries.cumsum分组。

    df["req_output"] = (
        df["item"]
        .map(lambda x: [x])
        .groupby(df["class_id"])
        .apply(lambda x: x.cumsum())
    )
    
      class_id  item req_output
    0        a     1        [1]
    1        a     2     [1, 2]
    2        a     3  [1, 2, 3]
    3        b     1        [1]
    4        b     2     [1, 2]
    

    或者我们可以创建一个函数来返回所需的列表并使用GroupBy.transform

    def get_slices(s):
        """
        >>> get_slices( pd.Series([1, 2, 3]) )
        [[1], [1, 2], [1, 2, 3]]
        """
        lst = s.tolist()
        return [lst[:i] for i in range(1, len(lst)+1)]
    
    df['req_output'] = df.groupby('class_id')['item'].transform(get_slices)
    

    【讨论】:

    • 利用?更像是虐待? :grin: 这是一个可爱的虐待
    • @sammywemmy 哈哈,这肯定是在滥用 :P 谢谢你,Sammy。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多