Intentando eliminar la fila indexada de NaN en el dataframe

Estoy usando python 2.7.3 y Pandas versión 0.12.0.

Quiero eliminar la fila con el índice NaN para que solo tenga valores válidos de site_id.

print df.head() special_name site_id NaN Banana OMG Apple df.drop(df.index[0]) TypeError: 'NoneType' object is not iterable 

Si bash soltar un rango, así:

 df.drop(df.index[0:1]) 

Me sale este error:

 AttributeError: 'DataFrame' object has no attribute 'special_name' 

Descubrí que la forma más fácil es restablecer el índice, eliminar los NaN y luego restablecer el índice nuevamente.

 In [26]: dfA.reset_index() Out[26]: index special_name 0 NaN Apple 1 OMG Banana In [30]: df = dfA.reset_index().dropna().set_index('index') In [31]: df Out[31]: special_name index OMG Banana 

Con la versión pandas> = 0.20.0 puedes:

df[df.index.notnull()]

Con versiones anteriores:

df[pandas.notnull(df.index)]

Para descomponerlo:

notnull genera una máscara booleana, por ejemplo, [False, False, True] , donde True denota que el valor en la posición correspondiente es nulo ( numpy.nan o None ). Luego seleccionamos las filas cuyo índice corresponde a un valor verdadero en la máscara usando df[boolean_mask] .

Probado esto para estar trabajando:

df.reset_index(inplace=True)

df.drop(df[df['index'].isnull()].index, inplace=True)


Como comprobé lo anterior

Replicó la tabla en la pregunta original usando df=pd.DataFrame(data=['Banana', 'Apple'], index=[np.nan, 'OMG'],columns=['Special_name'])

Luego ingrese los dos códigos anteriores, que bash explicar en lenguaje humano a continuación:

  • La primera línea restablece el índice a enteros, y el NaN ahora se encuentra en una columna que lleva el nombre original del índice (“índice” en el ejemplo anterior, ya que no se especificó un nombre): pandas lo hace automáticamente con el comando reset_index () .
  • 2ª línea desde los corchetes más internos: df[df['index'].isnull()] filtra las filas para las cuales la columna denominada ‘index’ muestra los valores de ‘NaN’ usando el comando isnull (). .index se usa para pasar un objeto de índice no ambiguo que apunta a todas las filas ‘index’ = NaN a df.drop( en la parte más externa de la expresión).

nb: probó el comando anterior para trabajar en múltiples valores de NaN en una columna

Utilizando Python 3.5.1, Pandas 0.17.1 a través del paquete Anaconda de 32 bits

Ninguna de las respuestas funcionó al 100% para mí. Esto es lo que funcionó:

 In [26]: print df Out[26]: site_id special_name 0 OMG Apple 1 NaN Banana 2 RLY Orange In [27]: df.dropna(inplace=True) Out[27]: site_id special_name 0 OMG Apple 2 RLY Orange In [28]: df.reset_index(inplace=True) Out[28]: index site_id special_name 0 0 OMG Apple 1 2 RLY Orange In [29]: df.drop('index', axis='columns', inplace=True) Out[29]: site_id special_name 0 OMG Apple 1 RLY Orange 

A partir de los pandas 0.19, los Index tienen un método .notnull() , por lo que la respuesta de timdiels se puede simplificar para:

 df[df.index.notnull()] 

que creo que es (actualmente) lo más simple que puedes conseguir.

Edición: lo siguiente probablemente solo se aplica a MultiIndex s, y en todo caso está obsoleto por la nueva función df.index.isnull() (ver otras respuestas). Dejaré esta respuesta solo por interés histórico.

Para las personas que llegan a esto ahora, uno puede hacer esto directamente sin reindexar, confiando en el hecho de que los NaN en el índice se representarán con la etiqueta -1 . Asi que:

 df = dfA[dfA.index.labels!=-1] 

Aún mejor, en Pandas> 0.16.1, uno puede usar drop () para hacer esto in situ sin copiar:

 dfA.drop(labels=[-1], level='index', inplace=True) 

NB: es un poco confuso que el nivel del índice se llame ‘índice’: por lo general, sería algo más específico de uso como ‘fecha’ o ‘experimental_run’.