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




leer para (10)

No dejes drop Solo toma filas donde EPS es finito :

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

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 marco de datos 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?


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, incluido 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 pandas.pydata.org/pandas-docs/stable/generated/… ), incluida la eliminación de columnas en lugar de filas.

¡Muy útil!


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. Entonces, si quieres esos, probablemente sea inteligente agregar esto también después.

df = df[df.EPS <= 0]

puedes usar pandas.pydata.org/pandas-docs/stable/generated/…

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 this para más ejemplos

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


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'])]

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

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.


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

Puedes usar esto:

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

A partir de la versión 0.16.1 se puede hacer.

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')




python pandas dataframe