¿Puedo usar pandas.dataframe.isin () con un parámetro de tolerancia numérico?

He revisado los siguientes mensajes de antemano. ¿Hay una manera de usar DataFrame.isin () con un factor de aproximación o un valor de tolerancia? ¿O hay otro método que podría?

Filtre las filas del dataframe si el valor en la columna está en una lista de valores establecida

usar una lista de valores para seleccionar filas de un dataframe de pandas

EX)

df = DataFrame({'A' : [5,6,3.3,4], 'B' : [1,2,3.2, 5]}) In : df Out: AB 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: AB 1 6 2 2 3.3 3.2 

Puedes hacer algo similar con numpy isclose :

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

np.isclose devuelve esto:

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

Es una comparación por pares de los elementos de df['A'] y [3, 6] (por eso necesitamos los df['A'].values[: None] – para la transmisión). Ya que está buscando si está cerca de alguno de ellos en la lista, llamamos .any(axis=1) al final.


Para columnas múltiples, cambie la porción un poco:

 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) 

Puede usar esta máscara para dividir el dataframe (es decir, df[mask] )


Si desea comparar df['A'] y df['B'] (y posiblemente otras columnas) con diferentes vectores, puede crear dos máscaras diferentes:

 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 = ... 

Luego rebana:

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