2014-10-01 24 views
6

Łączę moją ramkę danych Pandy: data. W szczególności chcę uzyskać średnią i sumę amount s przez krotki z [origin i type]. Dla uśredniania i zsumowanie Próbowałem funkcji NumPy poniżej:Agregacja pand ignorując NaN's

import numpy as np 
import pandas as pd 
result = data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum, pd.Series.mean]}).reset_index() 

Mój problem jest, że kolumna amount obejmuje NaN s, co powoduje result powyższego kodu, aby mieć dużo NaN średnie i sum.

Domyślnie wiem, że pd.Series.sum i pd.Series.mean mają domyślnie skipna=True, więc dlaczego wciąż mam tutaj NaN?

Próbowałem też to, co oczywiście nie działa:

data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum(skipna=True), pd.Series.mean(skipna=True)]}).reset_index() 

EDIT: Po użytkownika @ Korem sugestią, próbowałem też użyć partial jak poniżej:

s_na_mean = partial(pd.Series.mean, skipna = True)  
data.groupby(groupbyvars).agg({'amount': [ np.nansum, s_na_mean ]}).reset_index() 

ale ten błąd:

error: 'functools.partial' object has no attribute '__name__' 
+1

mógłbyś pisać przykładowe dane? Na początek, zamiast 'pd.Series.sum' - po prostu użyj' 'sum'' - kod powinien zająć szybszą ścieżkę. – chrisb

+0

Dziękuję, postanowiłem użyć 'pd.Series.sum' jus, ponieważ miał opcję' skipna'. Czytając odpowiedź @ Korem, teraz używam 'np.nansum'. Ale 'np.nanmean' nie jest dostępny w mojej wersji (1.7.1) z numpy. Postaram się opublikować reprezentatywne dane, co może trochę potrwać. – Rhubarb

Odpowiedz

5

Zastosowanie numpy na nansum i nanmean:

from numpy import nansum 
from numpy import nanmean 
data.groupby(groupbyvars).agg({'amount': [ nansum, nanmean]}).reset_index() 

Jako obejście dla starszych wersji numpy, a także sposób, aby naprawić swój ostatni spróbować:

Kiedy robisz pd.Series.sum(skipna=True) rzeczywiście wywołać metodę. Jeśli chcesz go użyć w ten sposób, chcesz zdefiniować partial. Więc jeśli nie masz nanmean, niech określić s_na_mean i używać:

from functools import partial 
s_na_mean = partial(pd.Series.mean, skipna = True) 
+0

Dziękuję, używam ** numpy-1.7.1-py2.7-win32.egg **, nie podoba mi się 'nanmean' wyrzucenie błędu:' obiekt 'module' nie ma atrybutu 'nanmean''. (Właśnie sprawdziłem, 'nanmean' jest nowy w wersji 1.8.0 – Rhubarb

+0

Ale' np.nansum' wydaje się być również dodany w wersji 1.8.0 Ciekawe, że nie dostaję tego samego błędu ... – Rhubarb

+0

Dzięki Korem, próbowałem tego, ale to nie zadziałało, edytowałem moje pytanie, podając błąd. Ponadto, czy nie jest domyślnie 'skipna = True' dla' pd.Series.mean'? – Rhubarb