2014-10-01 24 views
6

aggrego il mio dataframe Pandas: data. Nello specifico, voglio ottenere la media e sommare amount s di tuple di [origin e type]. Per la media e sommando ho provato le funzioni NumPy di ​​seguito:Aggregazione di panda ignorando NaN

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

Il mio problema è che la colonna amount comprende NaN s, che causa la result del codice qui sopra per avere un sacco di NaN media e somme.

So sia pd.Series.sum e pd.Series.mean hanno skipna=True di default, quindi perché sto ancora ricevendo NaN s qui?

Ho provato anche questo, che ovviamente non ha funzionato:

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

EDIT: Su @ di Korem suggerimento, ho anche cercato di utilizzare un partial come di seguito:

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

ma ottenere questo errore:

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

Potrebbe inserire alcuni dati di esempio? Inoltre, per iniziare, piuttosto che per 'pd.Series.sum' - basta usare' 'sum'' - il codice dovrebbe prendere un percorso più veloce. – chrisb

+0

Grazie, ho deciso di usare 'pd.Series.sum' perché aveva l'opzione' skipna'. Leggendo la risposta di Korem, ora uso 'np.nansum'. Ma 'np.nanmean' non è disponibile nella mia versione (1.7.1) di numpy. Proverò a postare dati rappresentativi, il che potrebbe richiedere del tempo. – Rhubarb

risposta

5

Usa NumPy nansum e nanmean:

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

Come soluzione alternativa per la versione precedente di NumPy, e anche un modo per risolvere il tuo ultimo tentativo:

Quando si esegue pd.Series.sum(skipna=True) in realtà chiama il metodo. Se vuoi usarlo in questo modo, vuoi definire un partial. Quindi, se non si dispone di nanmean, definiamo s_na_mean e l'uso che:

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

Grazie, io uso ** numpy-1.7.1-py2.7-win32.egg **, non mi piace 'nanmean' che lancia l'errore: l'oggetto' 'module 'non ha attributo' nanmean''. (Ho appena controllato, 'nanmean' è nuovo nella versione 1.8.0 – Rhubarb

+0

Ma' np.nansum' sembra essere aggiunto anche nella versione 1.8.0 È curioso che non ottenga lo stesso errore per quello ... – Rhubarb

+0

Grazie Korem, ho provato questo, ma non ha funzionato, ho modificato la mia domanda, dando l'errore. Inoltre, non è 'skipna = True' per' pd.Series.mean' di default comunque? – Rhubarb

Problemi correlati