我可以将pandas.dataframe.isin()与数字容差参数一起使用吗?

时间:2016-09-20 19:07:50

标签: python pandas comparison floating-accuracy comparison-operators

我事先审核了以下帖子。有没有办法使用具有近似因子或容差值的DataFrame.isin()?还是有其他方法可以吗?

Filter dataframe rows if value in column is in a set list of values

use a list of values to select rows from a pandas dataframe

EX)

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

1 个答案:

答案 0 :(得分:12)

您可以使用numpy's 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 & ...]