我有一个像下面这样的 Pandas 数据框。
+--------+-------------------+
| worker | day | tasks |
+--------+-------------------+
| A | 2 | 'read' |
| A | 9 | 'write' |
| B | 1 | 'read' |
| B | 2 | 'write' |
| B | 4 | 'execute' |
+--------+-------------------+
我需要按[col_1, day]对数据帧进行分组并获得累积的任务列表。
例如如果工作人员“A”在第 2 天有任务“已读”,那么第 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
由于您正在计算对象(而不是数字数据),因此我们需要应用 pd.Series.cumsum
而不是调用 cythonized GroupBy.cumsum
,它会阻塞python 列表。
关于python - 如何聚合 Pandas 数据框中的累积列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62875287/