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

web*_*ker 8 python comparison floating-accuracy comparison-operators pandas

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

如果列中的值位于设置的值列表中,则过滤数据帧行

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

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
Run Code Online (Sandbox Code Playgroud)

ayh*_*han 14

你可以用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
Run Code Online (Sandbox Code Playgroud)

np.isclose返回:

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

它是对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)
Run Code Online (Sandbox Code Playgroud)

您可以使用此掩码切片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 = ...
Run Code Online (Sandbox Code Playgroud)

然后切片:

df[mask1 & mask2]  # or df[mask1 & mask2 & mask3 & ...]
Run Code Online (Sandbox Code Playgroud)