una tablas seleccionar para nueva leer insertar funciones filtrar filas fila datos data columnas columna agregar python pandas dataframe

python - tablas - seleccionar filas pandas



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

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!

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?


No dejes drop Solo toma filas donde EPS es finito :

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


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


Podría usar el método notnull 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


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 esto:

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


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


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.


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 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:


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 ()