是否可以使用带有数字公差参数的pandas. datafframe .isin() ?



我事先看了下面的帖子。是否有一种方法来使用datafframe .isin()近似因子或容差值?或者有其他方法可以吗?

如果列中的值在值的集合列表中,则过滤数据框行

使用值列表从pandas数据框中选择行

交货)

df = DataFrame({'A' : [5,6,3.3,4], 'B' : [1,2,3.2, 5]})
In : df
Out:
   A    B
0  5    1
1  6    2
2  3.3  3.2
3  4    5  
df[df['A'].isin([3, 6], tol=.5)]
In : df
Out:
   A    B
1  6    2
2  3.3  3.2

您可以使用numpy的isclose做类似的事情:

df[np.isclose(df['A'].values[:, None], [3, 6], atol=.5).any(axis=1)]
Out: 
     A    B
1  6.0  2.0
2  3.3  3.2

np。Isclose返回:

np.isclose(df['A'].values[:, None], [3, 6], atol=.5)
Out: 
array([[False, False],
       [False,  True],
       [ True, False],
       [False, False]], dtype=bool)

这是df['A']的元素和[3, 6]的两两比较(这就是为什么我们需要df['A'].values[: None] -进行广播)。由于您正在寻找它是否接近列表中的任何一个,因此我们在最后调用.any(axis=1)


对于多列,稍微改变一下切片:

mask = np.isclose(df[['A', 'B']].values[:, :, None], [3, 6], atol=0.5).any(axis=(1, 2))
mask
Out: array([False,  True,  True, False], dtype=bool)

你可以使用这个掩码对DataFrame(即df[mask])进行切片


如果你想用不同的矢量比较df['A']df['B'](可能还有其他列),你可以创建两个不同的蒙版:

mask1 = np.isclose(df['A'].values[:, None], [1, 2, 3], atol=.5).any(axis=1)
mask2 = np.isclose(df['B'].values[:, None], [4, 5], atol=.5).any(axis=1)
mask3 = ...

然后切片:

df[mask1 & mask2]  # or df[mask1 & mask2 & mask3 & ...]

相关内容

  • 没有找到相关文章

最新更新