题解 | #牛客网连续练习题目3天及以上的用户#
牛客网连续练习题目3天及以上的用户
https://www.nowcoder.com/practice/4d77709a0ea2482282ee86852fe32f06
解法一(SQL思路): import pandas as pd from datetime import timedelta nowcoder=pd.read_csv('nowcoder.csv',sep=',') #提取年月日,新建date2列(不知道为啥不能直接赋值date列) nowcoder['date2']=pd.to_datetime(nowcoder['date']).dt.date #去重 nowcoder=nowcoder.drop_duplicates(subset=['user_id','date2']) #筛选2021年12月数据 nowcoder=nowcoder[(pd.to_datetime(nowcoder['date2']).dt.year==2021)&(pd.to_datetime(nowcoder['date2']).dt.month==12)] #根据user_id分组,根据date2排名 nowcoder['rank']=pd.to_timedelta(nowcoder.groupby('user_id')['date2'].transform('rank'),unit='d') #两列相减,值相同的为连续天 nowcoder['diff']=nowcoder['date2']-nowcoder['rank'] #连续天计数 grouped=nowcoder.groupby(['user_id','diff'])['date2'].count() #筛选连续天数大于等于3天的数据 grouped=grouped[grouped>=3] #筛选每个user_id的最大连续天数 print(grouped.reset_index().groupby('user_id')['date2'].max()) 解法二(循环思路): import pandas as pd from datetime import timedelta nowcoder=pd.read_csv('nowcoder.csv',sep=',') #排序,默认升序 nowcoder=nowcoder.sort_values(by=['user_id','date']) #提取年月日 nowcoder['date']=pd.to_datetime(nowcoder['date']).dt.date #去重 nowcoder=nowcoder.drop_duplicates(subset=['user_id','date']) #筛选2021年12月数据 nowcoder=nowcoder[(pd.to_datetime(nowcoder['date']).dt.year==2021)&(pd.to_datetime(nowcoder['date']).dt.month==12)] #新建列,连续天数,默认1天 nowcoder['con_days']=1 #更新连续天数 for i in range(nowcoder.shape[0]): if i>0: if nowcoder['user_id'].iloc[i]==nowcoder['user_id'].iloc[i-1]: if nowcoder['date'].iloc[i]==nowcoder['date'].iloc[i-1]+timedelta(1): nowcoder['con_days'].iloc[i]=nowcoder['con_days'].iloc[i-1]+1 #根据user_id分组,取最大连续天数 print(nowcoder.groupby('user_id')['con_days'].max())