Python pandas Filtrando nan de una selección de datos de una columna de cadenas

190

Sin usar, groupby¿cómo filtraría los datos sin NaN?

Digamos que tengo una matriz donde los clientes completarán 'N / A', 'n / a' o cualquiera de sus variaciones y otros lo dejarán en blanco:

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

salida:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

¿Cómo filtraría los valores de NaN para poder obtener resultados para trabajar así?

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

Supongo que necesito algo como, ~np.isnanpero la tilda no funciona con cadenas.

ccsv
fuente

Respuestas:

257

Solo déjalos caer:

nms.dropna(thresh=2)

esto eliminará todas las filas donde hay al menos dos no NaN.

Entonces podría soltar donde está el nombre NaN:

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

EDITAR

En realidad, mirando lo que originalmente quería, puede hacer esto sin la dropnallamada:

nms[nms.name.notnull()]

ACTUALIZAR

Mirando esta pregunta 3 años después, hay un error, en primer lugar, thresharg busca al menos nno NaNvalores, de hecho, el resultado debería ser:

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

Es posible que me haya equivocado hace 3 años o que la versión de pandas que estaba ejecutando tuviera un error, ambos escenarios son completamente posibles.

EdChum
fuente
194

La más simple de todas las soluciones:

filtered_df = df[df['name'].notnull()]

Por lo tanto, filtra solo las filas que no tienen valores NaN en la columna 'nombre'.

Para múltiples columnas:

filtered_df = df[df[['name', 'country', 'region']].notnull().all(1)]
Gil Baggio
fuente
9
df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})

for col in df.columns:
    df = df[~pd.isnull(df[col])]
Bashar Mohammad
fuente
5
df.dropna(subset=['columnName1', 'columnName2'])
JacoSolari
fuente