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