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}}
但是我的真实数据框很大,所以我想要一个矢量化算法而不是循环。
这里有一个类似的听起来的问题,但是看着接受的答案(这里),原始海报不希望像我一样累积地跨日期的唯一性。
我将如何在熊猫中进行矢量化?
解决方案
想法是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
推荐阅读
- sql-server - SQL Server 2014 - 监听 SQL Server 代理作业与存储过程“等待延迟” - 每秒 - 选项?可能的开销问题?
- spring-boot - Docker-compose 在运行数小时后崩溃
- android - 如何为低于 23 的 API 级别在图层列表中设置可绘制 (PNG) 宽度和高度?
- oauth-2.0 - 在 Spring Boot 和 OAUTH2 SalesForce 会话期间刷新令牌
- sparql - Marklogic Triple store 是否支持 Ontology 中的 SWRL?
- azure - 使用 Azure 认知搜索从 Docx 文件中检索相关数据
- c# - 通过文件夹名称检查 Google Drive 中是否存在文件夹(C#)
- terraform - Terraform - if 语句选择适当的变量
- swift - 将核心数据同步到 CloudKit 公共数据库
- python - 将 json 对象包装在另一个对象中