python - 计算每组连续 1 的最大数量
问题描述
给定以下结构的数据框
df1 = pd.DataFrame( data = {'userid':[465,465,999,999,999,999],
'postedDate':[pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-20'),pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-08'),pd.to_datetime('2018-11-14'), pd.to_datetime('2018-11-29')],
'value':[1,1,1,1,1,1]}).set_index('postedDate')
df1 = df1.groupby('userid').resample('W').count().drop('userid', axis =1 )
df1
userid postedDate value
465 2018-11-04 1
2018-11-11 0
2018-11-18 0
2018-11-25 1
999 2018-11-04 1
2018-11-11 1
2018-11-18 1
2018-11-25 0
2018-12-02 1
对于每个用户 ID,我想获得值 = 1 的最大连续周数。结果应该是
userid max_consecutive_wks
465 1
999 3
鉴于数据集的大小,任何使用for 循环的解决方案都无法在 Python 中运行,因此我正在寻找一种仅使用Pandas / Numpy的矢量化方法。
解决方案
使用移位 cumsum 技巧得到所有连续 1 的组,然后使用value_counts
找到最大的组。
u = df1['value'].eq(1)
v = u.ne(u.shift()).cumsum().where(u)
v.groupby(level=0).value_counts().max(level=0).reset_index(name='max_consec_wks')
userid max_consec_wks
0 465 1
1 999 3
where
需要调用以确保仅考虑 1 组(而不是 0)。
推荐阅读
- postman - 邮递员动态未设置的环境变量
- php - 条纹元素和 3d 安全
- javascript - 使用“严格动态”CSP 指令加载脚本的正确方法是什么?
- mysql - 查询连接两个表以根据“id”获取“名称”
- php - PHP - 如果结果为空,则执行/同时转到数组中的下一个
- vue.js - 如何在组件中使用指令
- javascript - 在其他功能中反应组件异步等待
- python - 带有 Flask-Ask 意图的 Python 定义和参数
- unity3d - 使用内部大脑进行预训练网络的 Unity 机器学习导致崩溃
- progressive-web-apps - Angular6 ServiceWorker 不缓存所有文件