2013-08-04 14 views
9

Mam dane załadowane do ramek danych, które mają indeks wielu nagłówków kolumn. Obecnie byłem grupowanie danych przez indeksy kolumn wziąć średnią z grup i obliczania przedziałów ufności 95% tak:Standardowy błąd ignorowania NaN w grupie pandy według grup

from pandas import * 
import pandas as pd 
from scipy import stats as st 

#Normalize to starting point then convert 
normalized = (data - data.ix[0]) * 11.11111 
#Group normalized data based on slope and orientation 
grouped = normalized.groupby(level=['SLOPE','DEPTH'], axis=1) 
#Obtain mean of each group 
means = grouped.mean() 
#Calculate 95% confidence interval for each group 
ci = grouped.aggregate(lambda x: st.sem(x) * 1.96) 

ale problem polega na tym, że funkcja oznacza, że ​​służy on grupy ignorują wartości NaN, podczas gdy funkcja scipy st.sem zwraca NaN, jeśli w grupie istnieje NaN. Muszę obliczyć błąd standardowy podczas ignorowania NaN, jak robi to funkcja średnia.

Próbowałem będzie o obliczenia 95% przedział ufności takiego:

#Calculate 95% confidence interval for each group 
ci = grouped.aggregate(lambda x: np.std(x)/??? * 1.96) 

std w numpy da mi odchylenie standardowe ignorując wartości NaN ale muszę podzielić to przez pierwiastek kwadratowy z wielkość grupy ignoruje NaN, aby uzyskać standardowy błąd.

Jaki jest najłatwiejszy sposób obliczenia błędu standardowego podczas ignorowania NaN?

+0

spróbować uwzględnić w 'GroupBy () 'function this:' normalized.groupby (by = [col_name_with_NaN], level = ['SLOPE', 'DEPTH'], axis = 1) ', dzięki czemu' Wartości NaN "nie powinny pojawiać się w" zgrupowanych " –

+0

Istnieje 36 kolumn i mogą być NaNs w danym wierszu, tj. brakujące dane. Sugerujesz przekazanie listy wszystkich nazw kolumn? Co robi argument by = []? Rozglądam się, ale nie mogę tego zrozumieć. – pbreach

+0

Tak, spróbuj przekazać wszystkie nazwy kolumn '36' do argumentu' by'. Nie dokładnie to, co ten argument ma, ale filtruje NaNs ... –

Odpowiedz

8

count() metoda Series obiektu powróci nie liczyć wartość NaN:

import pandas as pd 
s = pd.Series([1,2,np.nan, 3]) 
print s.count() 

wyjściowa:

3 

Tak, spróbuj:

ci = grouped.aggregate(lambda x: np.std(x)/x.count() * 1.96) 
+0

Pracował jak urok! Dziękuję Ci. – pbreach

+5

'grouped.aggregate (lambda x: np.std (x, ddof = 1)/np.sqrt (x.count()))' – Noah

Powiązane problemy