题解 | 牛客网连续练习题目3天及以上的用户
# 类SQL方法(未考虑单日多次答题的情况,需去重) # 导入库 # import pandas as pd # import datetime as dt # # 导入数据 # data = pd.read_csv('nowcoder.csv') # # 去掉日期的时间 # data['date'] = pd.to_datetime(data['date']).dt.date # # 计算每个用户在不同日期的排名,并将排名转换为datetime格式(单位为天),方便后续与日期求差 # data['rank'] = pd.to_timedelta(data.groupby('user_id')['date'].rank(), unit='d') # # 日期与排名求差,相等值的即为连续登录 # data['diff'] = data['date'] - data['rank'] # # 统计各用户连续登录次数并去重,防止同一用户单日多次答题 # con_user = data.groupby(['user_id', 'diff'])['date'].nunique().reset_index(name='question_id') # # 筛选大于3的登录天数 # con_user = con_user[con_user['question_id'] >= 3] # # 输出连续登录天数大于3的各用户最大登录天数 # print(con_user.reset_index().groupby('user_id')['question_id'].max()) # 聚合函数聚合后生成的列默认名为被聚合的列,用例中是以question_id来聚合,就将聚合列重命名为question_id,为了通过 # 循环方法 # 导入库 import pandas as pd import datetime as dt # 导入数据 data = pd.read_csv('nowcoder.csv') # 排序 data = data.sort_values(['user_id','date']) # 去掉日期的时间 data['date'] = pd.to_datetime(data['date']).dt.date # 去重(防止同一用户同一天多次登录) data = data.drop_duplicates(['user_id', 'date']) # 重置索引(排序与去重后需重置索引) data = data.reset_index(drop=True) # 建立连续登录天数列,初始值为1。列名取为question_id是为了通过用例 data['question_id'] = 1 # 循环更新连续登录天数 for i in range(data.shape[0]): if i > 0: if data['user_id'][i] == data['user_id'][i - 1]: if (data['date'][i] - data['date'][i - 1]).days == 1: data['question_id'][i] = data['question_id'][i-1] + 1 # 取单个用户最大连续登录天数 data = data[data['question_id'] >= 3] print(data.groupby('user_id')['question_id'].max())
根据评论区大佬解题思路按自己的理解复刻了两个思路,个人还是更倾向于循环解法,更容易理解。继续努力,希望看到需求可以独立写出代码!
##Python学习#