我有一个df,看起来像这样:
visits ={'someID':[111,111,111,222,222,222,333,333],
'Month':[1,3,5,1,2,4,3,4],
'visits':[4,10,5,2,2,2,5,5]}
df = pd.DataFrame.from_dict(visits)
someID Month Visits
111 1 4
111 3 10
111 5 5
222 1 2
222 2 2
222 4 2
333 3 5
333 4 5
数据框应解释为:
用户111访问了第1个月,但在第2个月进行了修改,并在第3个月返回,在第4个月进行了修改,并在第5个月返回。 用户222访问了第1个月和第2个月,在第3个月进行了翻腾,并在第4个月返回 用户333第一次访问是在第3个月(他不应该在第1个月和第2个月显示为搅和者)。你知道吗
总结每月客户流失数量和每月新访问数量的有效方法是什么? 客户流失=以前访问过,但当月未访问 新就诊=首次就诊
期望输出:(
Month Churns New_visits Totals
2 1 0 1
3 1 1 2
4 1 0 2
5 2 0 1
这个解决方案是黑客和没有优化,但它可能工作得足够快,为您的目的。你知道吗
首先,使用
pivot_table
统计每个用户ID每月的存在情况: 你知道吗创建按月数索引的空数据帧,准备接收整数计数:
在第一个pivot表数据框中,在每个用户的第一次访问之前,用非NaN sentinel值标记每个月,例如-1。使用每个用户的
first_valid_index
统计每个月的新访问者数量:对于每一行,将每一个NaN计算为一个搅动,将每一个正值计算为一个访问者:
这里有一种方法应该有效。你知道吗
首先,为了检测客户流失,我们需要重新编制索引,以便客户流失月份由
NaN
值表示。为此,首先生成列表元组(接下来将用于创建多索引):接下来,将列表压缩为ID-Month对,然后将列表展平并将其传递到
pd.MultiIndex
:..并创建一个新的数据帧,该数据帧用MultiIndex重新编制索引(而不是创建
df
的副本,或者将其赋值回df
):最后,创建一个列来跟踪新访问,如下所示:
…并使用此
groupby
表达式获取每月的客户流失和新访问次数:这里是一种尝试使用更多Python-y数据帧代码而不是迭代循环的方法。我不确定对性能的影响,但我认为数据帧操作比迭代操作快。不管怎样,让我们开始:
我们真的不需要访问栏,所以我们可以放弃
按月份排序和分组-分组依据中的计数基本上是总计列
我们可以通过执行列表的累积和,然后通过应用set构造函数仅获取unique来跟踪所有以前看到的访问者
(这是一种技巧,因为不能直接添加集合)
我想Python就是Python,但是你可以减去集合,我们可以通过减去这个月看到的访客集合和之前看到的所有访客集合来确定搅动列
我们可以通过从本月的访客数量中减去上个月的所有访客数量来确定新的访客数量
我们现在可以删除所有访客的跟踪栏,因为我们已经完成了,还有第一个月的连续记录
因为我们只对这些集合的计数感兴趣,所以我们可以将len构造函数应用于数据帧中的每个元素
我们可以清理最后的数据帧
就这样!你知道吗
相关问题 更多 >
编程相关推荐