2015-10-18 13 views
12

To mój dataframe:Jak wypełnić nanomastrami wartości danych z pustą listą [] w pandach?

  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,... 

Chcę zastąpić Nan z []. Jak to zrobić? Fillna ([]) nie działała. Próbowałem nawet replace(np.nan, []) ale daje błąd:

TypeError('Invalid "to_replace" type: \'float\'',) 
+0

w jaki sposób otrzymałeś listy w 'ids'? –

+1

Pusta lista nie może być przypisana, to 'df.ix [df ['ids']. Isnull(), 'ids'] = set()' set work? – Zero

+0

Należy zauważyć, że jednym z powodów jest to trudne, ponieważ tak naprawdę nie ma na celu przechowywania wartości nieskalowych w komórkach danych. Możesz to zrobić i czasami jest to przydatne jako krok pośredni (istnieje wiele wbudowanych metod, które * generują * listy jako elementy), ale nie ma jeszcze silnej obsługi. – DSM

Odpowiedz

7

można najpierw skorzystać loc zlokalizować wszystkie wiersze, które mają nan w kolumnie ids, a następnie pętli tych wierszy wykorzystujących at ustawić ich wartości do pustej listy :

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] 
+0

Trudno było znaleźć takie rozwiązanie. Naprawdę to doceniam. +1 – ALH

0

Bez zadań:

1) przy założeniu mamy tylko pływa i całkowitymi w naszym dataframe

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

2) Dla każdego dataframe

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

po wielu głowy drapania znalazłem tej metody, które powinny być najbardziej efektywne (bez pętli, brak odpowiedzi), po prostu przypisanie do wycinka:

isnull = df.ids.isnull() 

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

Sztuką było skonstruować listę [] o odpowiednim rozmiarze (isnull.sum()), a następnieująć go w liście: wartość, którą przypisujemy to 2D tablica (1 kolumna, isnull.sum() wiersze) zawierające puste listy jako elementy.

3

Moje podejście jest podobne do @ hellpanderrr, ale zamiast testy dla list-Ness zamiast używać isnan:

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

pierwotnie spróbował wykorzystać pd.isnull (lub pd.notnull), ale kiedy podano listę, która zwraca null-ness każdego elementu.

0

list nie jest obsługiwany w metodzie fillna, ale można zamiast tego użyć dict.

df.fillna({}) 
-1

utworzyć funkcję, która sprawdza stan pacjenta, jeśli nie, to zwraca pustą listę/zbiór pusty itd

następnie zastosować tę funkcję do zmiennej, ale także przypisania nowego zmienną obliczoną na stary jedną lub nową zmienną, jeśli chcesz.

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)) 
Powiązane problemy