您可以使用每对列的阈值,然后对生成的布尔列进行求和以获得所需的数字。但请注意,该数字取决于比较列的顺序。如果你使用的话,这种歧义就会消失abs(df['A']-df['B'])
等等,这很可能是您的意图。下面我假设这就是您所需要的。
一般来说,您可以使用itertools.combinations
生成每对列一次:
from itertools import combinations
df = pd.DataFrame(np.random.randn(12, 3), columns=['A', 'B', 'C'])
thresh = .3
df['matches'] = sum(abs(df[k1]-df[k2])<thresh for k1,k2 in combinations(df.keys(),2))
中的生成器表达式sum()
循环遍历每个列对,并构造相应的布尔向量。这些对每个列对进行求和,并将结果列附加到数据帧中。
示例输出thresh = 0.3
:
A B C matches
0 0.146360 -0.099707 0.633632 1
1 1.462810 -0.186317 -1.411988 0
2 0.358827 -0.758619 0.038329 0
3 0.077122 -0.213856 -0.619768 1
4 0.215555 1.930888 -0.488517 0
5 -0.946557 -0.904743 -0.004738 1
6 -0.080209 -0.850830 -0.866865 1
7 -0.997710 -0.580679 -2.231168 0
8 1.762313 -0.356464 -1.813028 0
9 1.151338 0.347636 -1.323791 0
10 0.248432 1.265484 0.048484 1
11 0.559934 -0.401059 0.863616 0
Using itertools.combinations
,各列比较为
>>> [k for k in itertools.combinations(df.keys(),2)]
('A', 'B'), ('A', 'C'), ('B', 'C')]
但如果您使用绝对值,这实际上并不重要(因为差异相对于列是对称的)。