题解 | #牛客网连续练习题目3天及以上的用户#
牛客网连续练习题目3天及以上的用户
https://www.nowcoder.com/practice/4d77709a0ea2482282ee86852fe32f06
import sys import pandas as pd fm=pd.read_csv('nowcoder.csv',sep=',') #预处理筛选 fm.date = fm.date.astype('str') fm=fm[fm.date.apply(lambda x:x[0:7])=='2021/12'] fm.date=pd.to_datetime(fm.date).dt.date fm=fm.drop_duplicates(subset=['user_id','date']) #或者使用split提取 # fm.date=fm.date.apply(lambda x:x.split()[0]) # fm.date=pd.to_datetime(fm.date) #方法一、笛卡尔连接 # fm=fm[['user_id','date']].drop_duplicates(subset=['user_id','date']) # fm2=fm # mg=pd.merge(fm,fm2,on='user_id',suffixes=('_a','_b'))#结果是同user_id名下的笛卡尔连接 # mg=mg[mg.date_a+pd.Timedelta(days=1)==mg.date_b] # mg=(mg.groupby('user_id').count()+1) # print(mg.date_a[mg.date_a>=3]) #方法二、使用日期-排名-聚合 fm=fm.sort_values(by='user_id') fm['rk']=fm.groupby('user_id')[['date']].rank(method='first')#根据用户排名,排名不重复 fm.date=pd.to_datetime(fm.date)#防止非向量化warning str转换回date fm['dif']=fm.date+pd.to_timedelta(-fm['rk'], unit='D')#连续的排名起始点相同 fm.dif=pd.to_datetime(fm.dif) r=fm.groupby(['user_id','dif']).size() #筛掉不需要的内容 r=r.groupby(level=0).max() #如果有多个起始点 选最大值 print(r.loc[r>=3])#天数大于2 for line in sys.stdin: a = line.split() print(int(a[0]) + int(a[1]))