gpt4 book ai didi

pandas - Pandas 中唯一值的累积计数

转载 作者:行者123 更新时间:2023-12-04 18:18:45 28 4
gpt4 key购买 nike

我想按周从 Pandas 框架中的列中累积计算唯一值。例如,假设我有这样的数据:

df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'week':[1,1,2,1,2,2],'module_id':['A','B','A','A','B','C']})

+---+---------+------+-----------+
| | user_id | week | module_id |
+---+---------+------+-----------+
| 0 | 1 | 1 | A |
| 1 | 1 | 1 | B |
| 2 | 1 | 2 | A |
| 3 | 2 | 1 | A |
| 4 | 2 | 2 | B |
| 5 | 2 | 2 | C |
+---+---------+------+-----------+

我想要的是每周的唯一 module_id 数量的运行计数,即像这样:

+---+---------+------+-------------------------+
| | user_id | week | cumulative_module_count |
+---+---------+------+-------------------------+
| 0 | 1 | 1 | 2 |
| 1 | 1 | 2 | 2 |
| 2 | 2 | 1 | 1 |
| 3 | 2 | 2 | 3 |
+---+---------+------+-------------------------+

将其作为循环执行很简单,例如这有效:
running_tally = {}
result = {}
for index, row in df.iterrows():
if row['user_id'] not in running_tally:
running_tally[row['user_id']] = set()
result[row['user_id']] = {}
running_tally[row['user_id']].add(row['module_id'])
result[row['user_id']][row['week']] = len(running_tally[row['user_id']])
print(result)

{1: {1: 2, 2: 2}, 2: {1: 1, 2: 3}}

但是我的真实数据框很大,所以我想要一个矢量化算法而不是循环。

有一个类似的问题 here ,但是查看已接受的答案( here ),原始海报不希望像我一样累积跨日期的唯一性。

我将如何在 Pandas 中进行矢量化?

最佳答案

想法是创造list s 每组按两列然后使用 np.cumsum对于累积列表,最后将值转换为集合并获取长度:

df1 = (df.groupby(['user_id','week'])['module_id']
.apply(list)
.groupby(level=0)
.apply(np.cumsum)
.apply(lambda x: len(set(x)))
.reset_index(name='cumulative_module_count'))

print (df1)
user_id week cumulative_module_count
0 1 1 2
1 1 2 2
2 2 1 1
3 2 2 3

关于pandas - Pandas 中唯一值的累积计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57055722/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com