首先梳理一下本题型的核心解题思路:求计算连续N天及以上的XXX  我这里举个例子:请用目测法告诉我,以下最长连续签到时间是几天?2022-08-012022-08-022022-08-032022-08-052022-08-062022-08-072022-08-082022-08-092022-08-102022-08-132022-08-142022-08-152022-08-16  答案是6天,签到日期为2022-08-05到2022-08-10 那么我们可以如何计算?题目要求是连续登录,重点是连续,那么一串连续的数字里有什么是保持不变的?那就是公差。 连续日期的单元单位是1,所以我们可以作出公差为1的等差数列作为辅助,如下所示2022-08-01    12022-08-02    22022-08-03    32022-08-05    42022-08-06    52022-08-07    62022-08-08    72022-08-09    82022-08-10    92022-08-13    102022-08-14    112022-08-15    122022-08-16    13这一步依然没看懂?再来看看下一步,将两列作差,请看看得到的结果2022-08-01    1    2022-07-312022-08-02    2    2022-07-312022-08-03    3    2022-07-312022-08-05    4    2022-08-012022-08-06    5    2022-08-012022-08-07    6    2022-08-012022-08-08    7    2022-08-012022-08-09    8    2022-08-012022-08-10    9    2022-08-012022-08-13    10    2022-08-032022-08-14    11    2022-08-032022-08-15    12    2022-08-032022-08-16    13    2022-08-03第三列其实就是我们想要知道的结果,每个字符出现的次数就是连续的次数! 譬如'2022-07-31'出现3次,代表连续签到3天 '2022-08-01'出现6次,代表连续签到6天 '2022-08-03'出现4次,代表连续签到4天所以最长连续签到是6天。  掌握了以上思路,那么直接看本题的解答(图文并茂) 首先准备模拟数据:nowcoder.csv user_id,question_id,result,date3270,110,wrong,2021/12/1 8:283328,111,wrong,2021/12/1 10:093617,121,right,2021/12/2 12:123344,112,right,2021/12/1 12:313415,113,wrong,2021/12/1 12:343712,119,right,2021/12/1 15:213516,114,right,2021/12/1 13:153518,115,right,2021/12/1 12:233516,116,right,2021/12/2 9:343712,123,right,2021/12/2 10:523516,117,wrong,2021/12/3 14:333617,118,right,2021/12/1 18:313617,122,wrong,2021/12/3 14:523712,125,wrong,2021/12/3 13:323328,129,wrong,2021/12/2 13:093270,130,right,2021/12/4 15:323270,131,wrong,2021/12/5 15:32最开始先导包、取数 import pandas as pddf = pd.read_csv('nowcoder.csv') 第一步:日期格式化成 yyyy-mm-dd df.date = pd.to_datetime(df.date,format="%Y-%m-%d").dt.date第二步:构建辅助有序自增列 df['order'] = df.groupby('user_id')['date'].rank(method="dense")第三步:按照user_id、date排序 df.sort_values(by=['user_id','date'],ascending=True,inplace=True)第四步:用date和第二步的辅助列作差 df['date_sub'] = pd.to_datetime(df.date)- pd.to_timedelta(df.order,unit='d')第五步:按照user_id、date_sub来分组,用count()聚合即可得知该user_id最长连续登录天数 df = df.groupby(['user_id','date_sub']).count().reset_index()第六步:按照题目要求输出 print(df.query("date >= 3").groupby('user_id')['date'].sum()) 完整代码如下: import pandas as pddf = pd.read_csv('nowcoder.csv')# 第一步:日期格式化成 yyyy-mm-dddf.date = pd.to_datetime(df.date,format="%Y-%m-%d").dt.date# 第二步:构建辅助有序自增列df['order'] = df.groupby('user_id')['date'].rank(method="dense")# 第三步:按照user_id、date排序df.sort_values(by=['user_id','date'],ascending=True,inplace=True)# 第四步:用date和第二步的辅助列作差df['date_sub'] = pd.to_datetime(df.date)- pd.to_timedelta(df.order,unit='d')# 第五步:按照user_id、date_sub来分组,用count()聚合即可得知该user_id最长连续登录天数df = df.groupby(['user_id','date_sub']).count().reset_index()# 第六步:按照题目要求输出print(df.query("date >= 3").groupby('user_id')['date'].sum())
点赞 0
评论 0
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务