2014-05-04 22 views
13

Mam dataframe pandy z kolumną prawdziwych wartości, które chcę zscore normalizować:jak zscore znormalizować kolumnę pandy z nans?

>> a 
array([ nan, 0.0767, 0.4383, 0.7866, 0.8091, 0.1954, 0.6307, 
     0.6599, 0.1065, 0.0508]) 
>> df = pandas.DataFrame({"a": a}) 

Problemem jest to, że pojedyncza wartość nan czyni cały wachlarz nan:

>> from scipy.stats import zscore 
>> zscore(df["a"]) 
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]) 

jaka jest prawidłowy sposób zastosowania zscore (lub równoważnej funkcji nie z scipy) do kolumny pandasowej ramki danych i czy ignoruje wartości nan? Chciałbym go mieć taki sam wymiar jak oryginalnej kolumny np.nan dla wartości, które nie mogą być znormalizowane

zmienił: Być może najlepszym rozwiązaniem jest użycie scipy.stats.nanmean i scipy.stats.nanstd? Nie widzę, dlaczego stopnie swobody muszą być zmienione na std do tego celu:

zscore = lambda x: (x - scipy.stats.nanmean(x))/scipy.stats.nanstd(x) 

Odpowiedz

17

dobrze pandas' wersje mean i std będzie oddać Nan więc może po prostu obliczyć w ten sposób (aby uzyskać tak samo jak scipy zscore myślę, że trzeba użyć ddof = 0 na std):

df['zscore'] = (df.a - df.a.mean())/df.a.std(ddof=0) 
print df 

     a zscore 
0  NaN  NaN 
1 0.0767 -1.148329 
2 0.4383 0.071478 
3 0.7866 1.246419 
4 0.8091 1.322320 
5 0.1954 -0.747912 
6 0.6307 0.720512 
7 0.6599 0.819014 
8 0.1065 -1.047803 
9 0.0508 -1.235699 
+0

Jeśli chcesz uzyskać z_score na wszystkich DataFrame, można spróbować użyć tego: '' 'def z_score (DF): powrotny (DF-df.mean())/df.std (ddof = 0) '' 'i' '' df.apply (z_score) '' ' –

4

można zignorować nans użyciu isnan.

z = a     # initialise array for zscores 
z[~np.isnan(a)] = zscore(a[~np.isnan(a)]) 
pandas.DataFrame({'a':a,'Zscore':z}) 

    Zscore  a 
0  NaN  NaN 
1 -1.148329 0.0767 
2 0.071478 0.4383 
3 1.246419 0.7866 
4 1.322320 0.8091 
5 -0.747912 0.1954 
6 0.720512 0.6307 
7 0.819014 0.6599 
8 -1.047803 0.1065 
9 -1.235699 0.0508 
+1

Myślę, że potrzebujesz" z = a.copy() "zamiast" z = a ", w przeciwnym razie z wskazuje na tę samą tablicę i zastąpisz elementy a swoimi zscores. – Pont

Powiązane problemy