Pandas筛选df_Movements中匹配df_Participants参与者ID的行结果不符
pandas两个DataFrame按ID匹配过滤异常排查方案
核心问题原因
匹配失败90%以上是两表关联ID的数据类型不一致导致的:
- df_Participants的
id列是浮点型(样例中显示为1053.0) - df_Movements的
participant列是整型(样例中显示为1053)
pandas的isin判断会同时校验值和数据类型,类型不同就算数值相等也会判定为不匹配。
排查步骤
- 第一步:验证数据类型
运行以下代码确认两列类型:print("df_Participants的id列类型:", df_Participants['id'].dtype) print("df_Movements的participant列类型:", df_Movements['participant'].dtype) - 第二步:统一ID列数据类型
优先选择转整型的方案(如果确认ID没有非整数值):
如果ID存在字符串、特殊字符的情况,统一转字符串处理更稳妥:remove_incomplete_submissions = True if remove_incomplete_submissions: # 先清理参与者表的ID:去掉空值、转成整型、去重 valid_participant_ids = df_Participants['id'].dropna().astype(int).unique() # 再过滤移动表 df_Movements = df_Movements.loc[df_Movements['participant'].isin(valid_participant_ids)]remove_incomplete_submissions = True if remove_incomplete_submissions: # 统一转字符串,去掉浮点型ID末尾的.0 valid_ids = df_Participants['id'].astype(str).str.rstrip('.0').unique() movement_ids = df_Movements['participant'].astype(str) df_Movements = df_Movements.loc[movement_ids.isin(valid_ids)] - 第三步:校验结果
运行代码确认过滤结果符合预期:# 查看过滤后的唯一参与者ID print(df_Movements['participant'].unique()) # 统计唯一数量,和参与者表的有效ID数量对比 print("过滤后唯一参与者数量:", df_Movements['participant'].nunique()) print("参与者表有效ID数量:", df_Participants['id'].dropna().nunique())
其他可能的排查点
- 若ID为字符串类型,先检查是否存在前后空格、不可见字符,可通过
str.strip()清理后再匹配- 两列中的NaN值
isin判断永远返回False,匹配前需先过滤掉空值- 若ID包含字母,需统一大小写后再匹配
内容的提问来源于stack exchange,提问作者London-35
相关产品推荐
相关产品推荐

