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

如何高效删除pandas DataFrame中不符合统计要求的行 图书评分场景

解决方法
  • 你之前的drop操作指定了axis=1,代表删除列而非行,同时drop默认不修改原DataFrame,没有赋值或加inplace=True参数自然不会生效
  • 你分组得到的是完整统计DataFrame,并非要删除的索引列表,直接传入drop无法识别匹配

以下两种实现都是pandas原生向量化操作,处理110万条数据仅需数秒,完全不需要逐行循环:

方案1:用transform直接生成过滤掩码(代码最简洁)

# 生成用户有效掩码:评分次数≥200的用户为True
mask_user = df_ratings.groupby('user')['rating'].transform('count') >= 200
# 生成图书有效掩码:被评分次数≥100的图书为True
mask_isbn = df_ratings.groupby('isbn')['rating'].transform('count') >= 100
# 保留同时满足两个条件的记录,任意一个不满足则删除
df_ratings_clean = df_ratings[mask_user & mask_isbn].copy()

如果你的rating列存在空值,把transform('count')换成transform('size')即可,size会统计所有行的数量,包含空值。

方案2:基于你已有的分组统计结果过滤

你已经算好了不符合要求的用户和图书分组,直接取索引生成无效列表过滤即可:

# 提取不符合要求的用户、isbn列表
invalid_users = df_groupby_user.index.tolist()
invalid_isbns = df_groupby_isbn.index.tolist()
# 过滤掉存在于无效列表中的记录
df_ratings_clean = df_ratings[~df_ratings['user'].isin(invalid_users) & ~df_ratings['isbn'].isin(invalid_isbns)].copy()

如果需要同步清理df_books,只保留清洗后评分表中存在的图书即可:

df_books_clean = df_books[df_books['isbn'].isin(df_ratings_clean['isbn'])].copy()

用你给出的示例数据测试,所有用户评分次数、所有图书被评分次数都为1,远小于阈值,过滤后会得到空表,符合规则预期。

内容的提问来源于stack exchange,提问作者ktarahb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 12:03:04