pandas中唯一值的累积计数[英] Cumulative count of unique values in pandas

本文是小编为大家收集整理的关于pandas中唯一值的累积计数的处理方法,想解了pandas中唯一值的累积计数的问题怎么解决?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}}

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

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

如何在 pandas 中进行矢量化处理?

推荐答案

想法是通过两列为每个组创建 lists,然后使用 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

本文地址:https://www.itbaoku.cn/post/1727983.html