You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:05:28