2014-10-01 21 views
6

Ich Aggregate meine Pandas Datenframe: data. Insbesondere möchte ich den Durchschnitt und die Summe amount s nach Tupeln von [origin und type] erhalten. Für Lungs und Summieren habe ich versucht, die numpy Funktionen unter:Pandas Aggregation Ignorieren NaN

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

Mein Problem ist, dass die amount Spalte enthält NaN s, die die result des obigen Codes verursacht eine Menge NaN Durchschnitt und Summen haben.

Ich kenne beide pd.Series.sum und pd.Series.meanskipna=True standardmäßig, also warum bin ich noch NaN s hier zu bekommen?

Ich habe auch versucht dies, was natürlich nicht funktioniert:

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

EDIT: Nach @ Korem Vorschlag, ich habe auch versucht, wie unten ein partial zu verwenden:

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

aber Erhalten Sie diesen Fehler:

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

Könnten Sie einige Beispieldaten posten? Beginnen Sie mit "pd.Series.sum" anstatt mit "sum'" - der Code sollte einen schnelleren Pfad haben. – chrisb

+0

Danke, ich habe mich entschieden, 'pd.Series.sum' zu benutzen, weil es eine 'skipna'-Option hatte. Bei der Antwort von @Korem benutze ich jetzt 'np.nansum'. Aber "np.nanmean" ist in meiner Version (1.7.1) von numpy nicht verfügbar. Ich werde versuchen, repräsentative Daten zu veröffentlichen, was eine Weile dauern kann. – Rhubarb

Antwort

5

Verwenden numpy des nansum und nanmean:

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

Als Abhilfe für ältere Version von numpy, und auch ein Weg, um Ihre letzten Versuch zu beheben:

Wenn Sie pd.Series.sum(skipna=True) tun Sie tatsächlich die Methode aufrufen. Wenn Sie es so verwenden möchten, müssen Sie eine partial definieren. Also, wenn Sie nicht nanmean haben, lassen Sie uns s_na_mean definieren und verwenden, die:

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

Danke, ich benutze ** numpy-1.7.1-py2.7-win32.egg **, es mag nicht "nanmean" den Fehler zu werfen: ''Modul' Objekt hat kein Attribut 'nanmean''. (Ich habe gerade überprüft, 'nanmean' ist neu in verison 1.8.0 – Rhubarb

+0

Aber' np.nansum' scheint auch in der Version 1.8.0 hinzugefügt zu werden. Es ist seltsam, dass ich nicht den gleichen Fehler dafür bekomme ... – Rhubarb

+0

Danke Koreum, ich habe das versucht, aber es hat nicht funktioniert, ich habe meine Frage bearbeitet und den Fehler gegeben.Auch ist 'skipna = True' für' pd.Series.mean' standardmäßig nicht voreingestellt? – Rhubarb