题解 | #牛客网连续练习题目3天及以上的用户#
牛客网连续练习题目3天及以上的用户
https://www.nowcoder.com/practice/4d77709a0ea2482282ee86852fe32f06
##参考sql的方法 import pandas as pd from datetime import timedelta#导入计算时间差的模块 df = pd.read_csv('nowcoder.csv') df['date'] = pd.to_datetime(df['date']).dt.date ##转换成日期(知识点2) df1 = df[['user_id','date']].drop_duplicates() ##对于用户和日期行去重,保证用户在一天只出现 一次 df1['rank1'] = df1.groupby('user_id')['date'].rank() ##分用户对登录日期进行排名,返回的是排名 df1['start_date'] = df1['date'] - df1['rank1'].apply(lambda x:timedelta(x)) ##若连续登录,则登陆日期减去对应排名应为同一天(不太理解) df1['continuous_days'] = df1.groupby(['user_id','start_date'])['date'].rank() ##对用户和起始日期同时分类后对日期做排名,得到当前日期是连续登录的第n天 print(df1[df1['continuous_days']>=3].groupby('user_id')['continuous_days'].max()) ##其实也不需要groupby,但本题结果给的是分类的结果,因此这样操作
思路:
对日期做排名,然后用date-rank1,得到start_date,对于相同start_date的列,说明是同一起始时间的连续日期。
以user_id和strat_date分组,计算不同用户,在不同起始时间下的连续登陆时间,结果存放在continous_days列,结果如下:
提取continous_days>=3的条目,然后以user_id分组,求出每个组中continous_days的最大值,得到结果
print(df1[df1['continuous_days']>=3].groupby('user_id')['continuous_days'].max())