题解 | 牛客网连续练习题目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学习#

全部评论

相关推荐

真是做吐了🤮
投递美团等公司10个岗位 >
点赞 评论 收藏
分享
zhiyog:哈哈哈,其实是津巴布韦币
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务