按userId分组后过滤DataFrame中movieId连续重复的行
解决按用户分组移除连续重复movieId行的问题
可以通过groupby结合transform生成过滤掩码的方式实现,既能保留所有列,又能精准过滤每个用户分组内的连续重复movieId行:
完整代码示例
import pandas as pd # 初始化原始DataFrame df1 = pd.DataFrame({ "timestamp": [pd.Timestamp(2016,7,29), pd.Timestamp(2017,8,22), pd.Timestamp(2017,10,9), pd.Timestamp(2018,1,9), pd.Timestamp(2018,3,31), pd.Timestamp(2018,7,5),pd.Timestamp(2018,8,5), pd.Timestamp(2018,9,5), pd.Timestamp(2018,11,6),pd.Timestamp(2018,12,6), pd.Timestamp(2018,12,8)], "userId": [1,2,2,2,2,2,3,4,4,4,4], "movieId": [111065,35455,132531,132531,2863,132531,4493,133813,8888,133813,133813], "rating":[3,4,5,2,4,3,2,2,3,1,3] }) # 生成过滤掩码:每个用户分组内,当前行movieId与上一行不同,或为分组首行 mask = df1.groupby('userId')['movieId'].transform(lambda x: x != x.shift(1)) # 应用掩码获取结果 filtered_df = df1[mask] print(filtered_df)
代码说明
groupby('userId')['movieId']:按用户分组,仅针对movieId列做对比处理transform(lambda x: x != x.shift(1)):对每个分组内的movieId,将当前行与上一行(shift(1))对比,返回布尔序列(True表示非连续重复行)df1[mask]:通过布尔索引过滤原始DataFrame,完整保留所有列
输出结果
执行后会过滤掉:
- userId=2中第4行(与前一行movieId重复)
- userId=4中最后一行(与前一行movieId重复)
保留的行如下:
timestamp userId movieId rating 0 2016-07-29 1 111065 3 1 2017-08-22 2 35455 4 2 2017-10-09 2 132531 5 4 2018-03-31 2 2863 4 5 2018-07-05 2 132531 3 6 2018-08-05 3 4493 2 7 2018-09-05 4 133813 2 8 2018-11-06 4 8888 3 9 2018-12-06 4 133813 1
内容的提问来源于stack exchange,提问作者xerxes01
相关产品推荐
相关产品推荐

