2015-07-22 2 views
5

Sto provando a sostituire alcuni valori NaN nei miei dati con una lista vuota []. Tuttavia la lista è rappresentata come una str e non mi permette di applicare correttamente la funzione len(). c'è comunque la possibilità di sostituire un valore NaN con una lista vuota effettiva nei panda?Sostituisci NaN con la lista vuota in un dataframe panda

In [28]: d = pd.DataFrame({'x' : [[1,2,3], [1,2], np.NaN, np.NaN], 'y' : [1,2,3,4]}) 

In [29]: d 
Out[29]: 
      x y 
0 [1, 2, 3] 1 
1  [1, 2] 2 
2  NaN 3 
3  NaN 4 

In [32]: d.x.replace(np.NaN, '[]', inplace=True) 

In [33]: d 
Out[33]: 
      x y 
0 [1, 2, 3] 1 
1  [1, 2] 2 
2   [] 3 
3   [] 4 

In [34]: d.x.apply(len) 
Out[34]: 
0 3 
1 2 
2 2 
3 2 
Name: x, dtype: int64 

risposta

7

Questo funziona utilizzando isnull e loc per mascherare la serie:

In [90]: 
d.loc[d.isnull()] = d.loc[d.isnull()].apply(lambda x: []) 
d 

Out[90]: 
0 [1, 2, 3] 
1  [1, 2] 
2   [] 
3   [] 
dtype: object 

In [91]: 
d.apply(len) 

Out[91]: 
0 3 
1 2 
2 0 
3 0 
dtype: int64 

Bisogna farlo usando apply affinché l'oggetto elenco non deve essere interpretato come un array per assegnare indietro al df che cercherà di allineare la figura posteriore alla serie originale

EDIT

Utilizzando il campione aggiornato i seguenti lavori:

In [100]: 
d.loc[d['x'].isnull(),['x']] = d.loc[d['x'].isnull(),'x'].apply(lambda x: []) 
d 

Out[100]: 
      x y 
0 [1, 2, 3] 1 
1  [1, 2] 2 
2   [] 3 
3   [] 4 

In [102]:  
d['x'].apply(len) 

Out[102]: 
0 3 
1 2 
2 0 
3 0 
Name: x, dtype: int64 
+0

fa questo lavoro lo stesso quando l'accesso una colonna in una dataframe perché non sembra di lavorare per me. – moku

+0

Scusa, intendi 'df [col] .apply'? dovresti fare 'd.loc [d [col] .isnull(), col] = d.loc [d [col] .isnull(), col] .apply (lambda x: [])' – EdChum

+0

hmmm Non riesco a farlo funzionare – moku

Problemi correlati