首页 > 解决方案 > 到目前为止,按同一组中的聚合元素分组 - Pandas

问题描述

以下是输出应如何显示的示例:

数据框:具有所需输出的 ​​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]

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

标签: pythonpandasdataframegroup-bypandas-groupby

解决方案


首先,将每个元素放入大小为 1 的列表中。在这里,我们(利用滥用?)事实[1] + [2] = [1, 2]。然后按 和 分组。GroupBy.apply Series.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)

推荐阅读