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