使用isin过滤Pandas DataFrame后数值不符问题求助
问题分析与解答
核心错误:混淆了「总行数」和「唯一用户数」的概念
你的计算逻辑完全不对,users['user_id'].size - interactions['user_id'].unique().size这个减法没有任何实际意义,不能用来验证过滤后的行数:
users['user_id'].size是原始users的总行数(包含同一个user_id的重复行)interactions['user_id'].unique().size是interactions里有过交互的唯一用户数量
这两个数值的维度完全不同,相减的结果和过滤后的行数没有关联。
你的过滤代码本身是正确的
users = users[users.user_id.isin(interactions['user_id'])]这段代码的逻辑没问题:它会保留users中所有user_id出现在interactions里的行(不管这个user_id在interactions里出现多少次,也不管users里这个user_id有多少重复行)。
正确的验证方式
要验证过滤结果是否正确,应该计算原始users中被排除的行数,再用总行数减去这个值:
# 计算被排除的行数(user_id不在interactions里的行) excluded_rows = users[~users.user_id.isin(interactions['user_id'])].shape[0] # 验证:原始总行数 - 被排除行数 应该等于过滤后的行数 print(818683 - excluded_rows == 566772)
举个简单例子帮你理解
假设:
- 原始
users有5行:user_id为[1,1,2,3,3](总行数5) interactions的user_id为[1,3](唯一用户数2)- 过滤后的
users是[1,1,3,3](共4行)
如果按你的计算方式:5 - 2 = 3,显然和实际过滤后的4行不符——这就是因为你把「总行数」和「唯一用户数」混为一谈了。
内容的提问来源于stack exchange,提问作者Егор Трифонов
相关产品推荐
相关产品推荐

