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

标签 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

例如)

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'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 & ...]

关于python - 我可以将 pandas.dataframe.isin() 与数字容差参数一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602004/

相关文章:

python - 如何将嵌套字典转换为 pandas 数据框?

python - 我怎样才能有效地获得[许多]四分位数?

c++ - 这是做什么的?如果(无符号(x-dx)<无符号(大小))

attributes - LDAP 比较属性

javascript - 为什么 Javascript 严格比较会这样做?

python - 使用 Flask 和 Gunicorn 设置 Google 凭据

python - pyPdf如何理解文档边界?

python - 导入错误: cannot import name 'LatentDirichletAllocation'

python - 有人可以给我一个关于 WSGI 幕后细节与 Python 的其他 Web 界面方法的高级技术概述吗?

python - Pandas Dataframe 中的空白列