如何检查pandas Series值是否出现在另一DataFrame的对应行中
问题根因
错误是因为你在实际运行的代码中,给series.values == df额外套了一层多余的方括号:
原正确示例中的写法是np.sum(s.values == df, axis=1) >0,但你实际运行的是np.sum([series.values==df], axis=1) >0,外层多出来的[]会给原本shape为(行数, 列数)的布尔矩阵新增一个维度,变成(1, 行数, 列数)的三维数组,求和时的维度逻辑完全错乱,触发了pandas的长度校验错误。
优化解决方案
推荐直接使用pandas原生方法实现需求,不仅写法更简洁,还能自动处理NaN的等值判定(原生==会认为NaN == NaN结果为False,eq方法会判定为True,符合你示例中NaN行的匹配预期):
# axis=0表示按行对齐Series和DataFrame的索引做元素级比较 # any(axis=1)表示判断每行是否存在至少一个匹配项 mask = df.eq(series, axis=0).any(axis=1)
如果要保留你原来的numpy写法,只需要去掉外层多余的方括号即可:
mask = np.sum(series.values == df, axis=1) > 0
- 注意:如果你的数值是浮点计算生成的,存在精度误差风险,可以用以下方式做近似匹配:
mask = np.isclose(df, series.values[:, None], equal_nan=True).any(axis=1)
效果验证
以你给出的示例数据为例,最终生成的mask最后4行会返回True,完全符合预期。
内容的提问来源于stack exchange,提问作者user3062260
相关产品推荐
相关产品推荐

