Cómo eliminar filas de Pandas DataFrame cuyo valor en ciertas columnas es NaN

Tengo un DataFrame :

 >>> df STK_ID EPS cash STK_ID RPT_Date 601166 20111231 601166 NaN NaN 600036 20111231 600036 NaN 12 600016 20111231 600016 4.3 NaN 601009 20111231 601009 NaN NaN 601939 20111231 601939 2.5 NaN 000001 20111231 000001 NaN NaN 

Entonces solo quiero los registros cuyo EPS no es NaN , es decir, df.drop(....) devolverá el dataframe como se muestra a continuación:

  STK_ID EPS cash STK_ID RPT_Date 600016 20111231 600016 4.3 NaN 601939 20111231 601939 2.5 NaN 

¿Cómo puedo hacer eso?

No dejes drop Solo toma filas donde EPS es finito :

 df = df[np.isfinite(df['EPS'])] 

Esta pregunta ya está resuelta, pero …

… también considere la solución sugerida por Wouter en su comentario original . La capacidad de manejar los datos faltantes, incluyendo dropna() , está integrada explícitamente en pandas. Aparte de un rendimiento potencialmente mejor que hacerlo manualmente, estas funciones también vienen con una variedad de opciones que pueden ser útiles.

 In [24]: df = pd.DataFrame(np.random.randn(10,3)) In [25]: df.iloc[::2,0] = np.nan; df.iloc[::4,1] = np.nan; df.iloc[::3,2] = np.nan; In [26]: df Out[26]: 0 1 2 0 NaN NaN NaN 1 2.677677 -1.466923 -0.750366 2 NaN 0.798002 -0.906038 3 0.672201 0.964789 NaN 4 NaN NaN 0.050742 5 -1.250970 0.030561 -2.678622 6 NaN 1.036043 NaN 7 0.049896 -0.308003 0.823295 8 NaN NaN 0.637482 9 -0.310130 0.078891 NaN 

 In [27]: df.dropna() #drop all rows that have any NaN values Out[27]: 0 1 2 1 2.677677 -1.466923 -0.750366 5 -1.250970 0.030561 -2.678622 7 0.049896 -0.308003 0.823295 

 In [28]: df.dropna(how='all') #drop only if ALL columns are NaN Out[28]: 0 1 2 1 2.677677 -1.466923 -0.750366 2 NaN 0.798002 -0.906038 3 0.672201 0.964789 NaN 4 NaN NaN 0.050742 5 -1.250970 0.030561 -2.678622 6 NaN 1.036043 NaN 7 0.049896 -0.308003 0.823295 8 NaN NaN 0.637482 9 -0.310130 0.078891 NaN 

 In [29]: df.dropna(thresh=2) #Drop row if it does not have at least two values that are **not** NaN Out[29]: 0 1 2 1 2.677677 -1.466923 -0.750366 2 NaN 0.798002 -0.906038 3 0.672201 0.964789 NaN 5 -1.250970 0.030561 -2.678622 7 0.049896 -0.308003 0.823295 9 -0.310130 0.078891 NaN 

 In [30]: df.dropna(subset=[1]) #Drop only if NaN in specific column (as asked in the question) Out[30]: 0 1 2 1 2.677677 -1.466923 -0.750366 2 NaN 0.798002 -0.906038 3 0.672201 0.964789 NaN 5 -1.250970 0.030561 -2.678622 6 NaN 1.036043 NaN 7 0.049896 -0.308003 0.823295 9 -0.310130 0.078891 NaN 

También hay otras opciones (consulte los documentos en http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html ), incluida la eliminación de columnas en lugar de filas.

¡Muy útil!

Sé que esto ya ha sido respondido, pero solo por una solución puramente pandas a esta pregunta específica en contraposición a la descripción general de Aman (que fue maravillosa) y en caso de que alguien más lo descubra:

 import pandas as pd df = df[pd.notnull(df['EPS'])] 

Puedes usar esto:

 df.dropna(subset=['EPS'], how='all', inplace = True) 

La más simple de todas las soluciones:

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

La solución anterior es mucho mejor que usar np.isfinite ()

Podría usar el método de dataframe no nulo o inverso de isnull , o numpy.isnan :

 In [332]: df[df.EPS.notnull()] Out[332]: STK_ID RPT_Date STK_ID.1 EPS cash 2 600016 20111231 600016 4.3 NaN 4 601939 20111231 601939 2.5 NaN In [334]: df[~df.EPS.isnull()] Out[334]: STK_ID RPT_Date STK_ID.1 EPS cash 2 600016 20111231 600016 4.3 NaN 4 601939 20111231 601939 2.5 NaN In [347]: df[~np.isnan(df.EPS)] Out[347]: STK_ID RPT_Date STK_ID.1 EPS cash 2 600016 20111231 600016 4.3 NaN 4 601939 20111231 601939 2.5 NaN 

otra solución más que utiliza el hecho de que np.nan != np.nan :

 In [149]: df.query("EPS == EPS") Out[149]: STK_ID EPS cash STK_ID RPT_Date 600016 20111231 600016 4.3 NaN 601939 20111231 601939 2.5 NaN 

puedes usar dropna

Ejemplo

Suelte las filas donde falta al menos un elemento.

 df=df.dropna() 

Definir en qué columnas buscar valores faltantes.

 df=df.dropna(subset=['column1', 'column1']) 

Vea esto para más ejemplos

Nota: el parámetro axis de dropna está en desuso desde la versión 0.23.0:

O (compruebe si hay NaN con isnull , luego use ~ para hacer lo contrario a no NaN):

 df=df[~df['EPS'].isnull()] 

Ahora:

 print(df) 

Es:

  STK_ID EPS cash STK_ID RPT_Date 600016 20111231 600016 4.3 NaN 601939 20111231 601939 2.5 NaN 

Se puede agregar a la que se puede usar ‘&’ para agregar condiciones adicionales, por ejemplo,

 df = df[(df.EPS > 2.0) & (df.EPS <4.0)] 

Tenga en cuenta que al evaluar las declaraciones, los pandas necesitan paréntesis.

Manera simple y fácil.

df.dropna(subset=['EPS'],inplace=True)

fuente: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

Esta respuesta es mucho más simple que todas las anteriores 🙂

 df=df[df['EPS'].notnull()] 

Por alguna razón, ninguna de las respuestas enviadas anteriormente funcionó para mí. Esta solución básica hizo:

 df = df[df.EPS >= 0] 

Aunque, por supuesto, eso también eliminará filas con números negativos. Así que si quieres eso, probablemente sea inteligente agregar esto también después.

 df = df[df.EPS <= 0]