remove not dropna python pandas nan

python - not - ¿Cómo llenar los valores de Nan del marco de datos con una lista vacía[] en pandas?



pandas merge (6)

Este es mi marco de datos:

date ids 0 2011-04-23 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 2011-04-24 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 2011-04-25 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 2011-04-26 Nan 4 2011-04-27 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 2011-04-28 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...

Quiero reemplazar a Nan con []. ¿Como hacer eso? Fillna ([]) no funcionó. Incluso intenté replace(np.nan, []) pero da error:

TypeError(''Invalid "to_replace" type: /'float/''',)


Cree una función que verifique su condición, si no, devuelve una lista vacía / conjunto vacío, etc.

Luego aplique esa función a la variable, pero también asigne la nueva variable calculada a la antigua o a una nueva variable si lo desea.

aa=pd.DataFrame({''d'':[1,1,2,3,3,np.NaN],''r'':[3,5,5,5,5,''e'']}) def check_condition(x): if x>0: return x else: return list() aa[''d]=aa.d.apply(lambda x:check_condition(x))


Después de mucho rascarse la cabeza, encontré este método que debería ser el más eficiente (sin bucles, no se aplica), simplemente asignándolo a una porción:

isnull = df.ids.isnull() df.loc[isnull, ''ids''] = [ [[]] * isnull.sum() ]

El truco consistió en construir su lista de [] del tamaño correcto ( isnull.sum() ), y luego encerrarla en una lista: el valor que está asignando es una matriz 2D (1 columna, isnull.sum() filas) Contiene listas vacías como elementos.


Mi enfoque es similar al de @ hellpanderrr, pero en lugar de eso prueba la lista en lugar de usar isnan :

df[''ids''] = df[''ids''].apply(lambda d: d if isinstance(d, list) else [])

Originalmente intenté usar pd.isnull (o pd.notnull ) pero, cuando me dieron una lista, devuelve la nulidad de cada elemento.


Primero puede usar loc para ubicar todas las filas que tienen un nan en la columna de ids , y luego recorrer estas filas usando at para establecer sus valores en una lista vacía:

for row in df.loc[df.ids.isnull(), ''ids''].index: df.at[row, ''ids''] = [] >>> df date ids 0 2011-04-23 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 1 2011-04-24 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 2 2011-04-25 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 3 2011-04-26 [] 4 2011-04-27 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 5 2011-04-28 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]


Sin asignaciones:

1) Suponiendo que solo tenemos flotantes y enteros en nuestro marco de datos

import math df.apply(lambda x:x.apply(lambda x:[] if math.isnan(x) else x))

2) Para cualquier marco de datos

import math def isnan(x): if isinstance(x, (int, long, float, complex)) and math.isnan(x): return True df.apply(lambda x:x.apply(lambda x:[] if isnan(x) else x))


list no es compatible con el método fillna , pero puede usar dict lugar.

df.fillna({})