Python 如何在数据帧中聚合累积列表?

Python 如何在数据帧中聚合累积列表?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个像下面这样的熊猫数据框 +--------+-------------------+ | worker | day | tasks | +--------+-------------------+ | A | 2 | 'read' | | A | 9 | 'write' | | B | 1 | 'read' | | B | 2 | '

我有一个像下面这样的熊猫数据框

    +--------+-------------------+
    | worker |  day  |    tasks  |
    +--------+-------------------+
    |   A    |   2   | 'read'    |
    |   A    |   9   | 'write'   |
    |   B    |   1   | 'read'    |
    |   B    |   2   | 'write'   |
    |   B    |   4   | 'execute' |
    +--------+-------------------+
我需要按[col_1,day]对数据帧进行分组,并获得一个精确的任务列表。
e、 g.如果工人“A”在第2天读取了任务“read”,则第9天的任务应为 [“读”、“写”]列表


所需的数据帧如下所示:

    +--------+-------------------------------------+
    | worker |  day  |          aggregation        |
    +--------+-------------------------------------+
    |   A    |   2   | ['read']                    |
    |   A    |   9   | ['read', 'write']           |
    |   B    |   1   | ['read']                    |
    |   B    |   2   | ['read', 'write']           |
    |   B    |   4   | ['read', 'write', 'execute']|
    +--------+-------------------------------------+

我试着用cumsum

df = df.groupby(['worker', 'day'])['tasks'].apply(list).reset_index(name='aggregation').cumsum()

但是它会对所有列进行累加,而不是对特定列的组内累加。

一个简单的方法(虽然性能不理想,但您还是将列表存储在列中,因此您的里程数会有所不同)是对列表执行
groupby
cumsum

df['tasks'].map(lambda x: [x]).groupby(df['worker']).apply(pd.Series.cumsum) 

0                    [read]
1             [read, write]
2                    [read]
3             [read, write]
4    [read, write, execute]
Name: tasks, dtype: object
或者,非常相似

(df.assign(tasks=df['tasks'].map(lambda x: [x]))
   .groupby('worker')['tasks']
   .apply(pd.Series.cumsum))

0                    [read]
1             [read, write]
2                    [read]
3             [read, write]
4    [read, write, execute]
Name: tasks, dtype: object

由于您是cumsuming对象(而不是数字数据),我们需要应用
pd.Series.cumsum
而不是调用被python列表阻塞的cythonized
GroupBy.cumsum

df['tasks'].map(lambda x:[x]).cumsum()在
list
上工作,而
df['tasks'].map(lambda x:[x]).GroupBy(df['worker']).cumsum()
不要,这背后的原因是什么?任何内部实现限制?@ShubhamSharma不确定,但它看起来像是
GroupBy.cumsum
是cythonized,默认情况下需要数字数据。我想这是某种错误,但不是一个大错误。@cs95,非常感谢您提供的详细答案。这真的很有帮助。