如何高效删除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
相关产品推荐
相关产品推荐

