我正在尝试使用Python Pandas计算一段时间内每天回访我网站的访问者。
示例数据:
df1 = pd.DataFrame({'user_id':[1,2,3,1,3], 'date':['2012-09-29','2012-09-30','2012-09-30','2012-10-01','2012-10-01']})
print df1
date user_id
0 2012-09-29 1
1 2012-09-30 2
2 2012-09-30 3
3 2012-10-01 1
4 2012-10-01 3
我希望得到最终结果:
df1_result = pd.DataFrame({'count_new':[1,2,0], 'date':['2012-09-29','2012-09-30','2012-10-01']})
print df1_result
count_new date
0 1 2012-09-29
1 2 2012-09-30
2 0 2012-10-01
第一天有1个新用户,因为用户1是第一次出现。
第二天有2个新用户:第一次出现用户2和用户3。
最后在第三天有0个新用户:用户1和用户3都已在之前的时段出现过。
到目前为止,我一直在考虑合并两个相同数据帧的副本并按日期移动一个,但没有成功:
pd.merge(df1, df1.user_id.shift(-date), on = 'date').groupby('date')['user_id_y'].nunique()
非常感谢任何帮助,
谢谢
答案 0 :(得分:2)
>>> (df1
.groupby(['user_id'], as_index=False)['date'] # Group by `user_id` and get first date.
.first()
.groupby(['date']) # Group result on `date` and take counts.
.count()
.reindex(df1['date'].unique()) # Reindex on original dates.
.fillna(0)) # Fill null values with zero.
user_id
date
2012-09-29 1
2012-09-30 2
2012-10-01 0
答案 1 :(得分:1)
最好添加一个新列Isreturning
(如果您需要在将来回复客户时进行分析)
df['Isreturning']=df.groupby('user_id').cumcount()
仅显示新客户
df.loc[df.Isreturning==0,:].groupby('date')['user_id'].count()
Out[840]:
date
2012-09-29 1
2012-09-30 2
Name: user_id, dtype: int64
或者你可以:
df.groupby('date')['Isreturning'].apply(lambda x : len(x[x==0]))
Out[843]:
date
2012-09-29 1
2012-09-30 2
2012-10-01 0
Name: Isreturning, dtype: int64