[英]Python Pandas Groupby to count unique records in a single column
[英]Python Pandas: groupby date and count new records for each period
我正在尝试使用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()
任何帮助将非常感激,
谢谢
>>> (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
最好添加一个新列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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.