web*_*ker 8 python comparison floating-accuracy comparison-operators pandas
我事先审查了以下帖子.有没有办法使用具有近似因子或容差值的DataFrame.isin()?还是有其他方法可以吗?
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)
| 归档时间: |
|
| 查看次数: |
2237 次 |
| 最近记录: |