Python Pandas:groupby日期并计算每个时期的新记录

时间:2017-09-12 16:29:22

标签: python pandas grouping

我正在尝试使用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()

非常感谢任何帮助,

谢谢

2 个答案:

答案 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