为什么Pandas的isin()方法双向匹配得到的True数量不一致?
问题解答
核心结论
这种情况完全可能出现,两个操作的True计数本身不存在必然相等的关系。
根本原因
a.isin(b)和b.isin(a)的统计逻辑完全不对等:
a.isin(b)的计算逻辑:遍历序列a的每一个元素,判断该元素是否存在于序列b的唯一值集合中,返回的布尔序列长度和a完全相等,统计True的数量就是a中符合条件的元素总数b.isin(a)的计算逻辑:遍历序列b的每一个元素,判断该元素是否存在于序列a的唯一值集合中,返回的布尔序列长度和b完全相等,统计True的数量就是b中符合条件的元素总数
两个统计的基础样本池是完全不同的两个序列,最终的True计数自然可能出现较大差异。
示例验证
举一个最典型的场景:
import pandas as pd a = pd.Series([1]*10) # 长度为10,所有元素都是1 b = pd.Series([1,2]) # 长度为2,元素为1和2 # a.isin(b)的True数量:10个(a所有元素都在b里) print(a.isin(b).sum()) # 输出10 # b.isin(a)的True数量:1个(b只有1在a里,2不在) print(b.isin(a).sum()) # 输出1
上述示例就完全复现了你遇到的a.isin(b)的True数量远大于b.isin(a)的情况。
其他可能的影响因素
- 数据类型不匹配:比如a中的值为整数
1,b中对应的值为字符串'1',pandas的isin判断会认为二者不相等,会直接影响两边的匹配计数 - 空值特殊规则:pandas中
NaN和自身不相等,因此如果a、b中存在NaN,即使两边都有NaN,也不会被判定为匹配,不会计入True计数 - 笔误误区:你问题中提到的
len(match)>>len(match2)大概率是笔误,match作为和a等长的布尔序列,len(match)永远等于a的长度,len(match2)永远等于b的长度,你实际统计的应该是True的数量,即match.sum() >> match2.sum()。
内容的提问来源于stack exchange,提问作者confused student
相关产品推荐
相关产品推荐

