2014-10-01 123 views
6

我聚合我的熊貓數據框:data。具體來說,我想通過[origintype]的元組得到平均值和總和amount。對於平均和總結我試過numpy的功能如下:熊貓聚集忽略NaN的

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

我的問題是,amount列包括NaN s,這導致上述代碼的result有很多的NaN平均數額。

我知道pd.Series.sumpd.Series.mean默認有skipna=True,所以爲什麼我仍然在這裏得到NaN

我也試過這個,這顯然沒有奏效:

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

編輯: 在@ Korem的建議下,我還試圖用一個partial如下:

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

但得到這個錯誤:

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

你能發佈一些示例數據?另外,首先,而不是'pd.Series.sum' - 只使用'sum' - 代碼應該採用更快的路徑。 – chrisb 2014-10-01 16:26:46

+0

謝謝,我決定使用'pd.Series.sum'因爲它有一個'skipna'選項。閱讀@ Korem的回答,我現在使用'np.nansum'。但'np.nanmean'在我的numpy版本(1.7.1)中不可用。我會嘗試發佈代表性數據,這可能需要一段時間。 – Rhubarb 2014-10-02 07:12:40

回答

5

使用numpy的的nansumnanmean

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

至於舊版本numpy的,而且也是一個解決辦法的方式來解決您的最後一次嘗試:

當你做pd.Series.sum(skipna=True)你實際上調用該方法。如果你想像這樣使用它,你想定義一個partial。所以,如果你沒有做nanmean,讓我們定義s_na_mean和使用:

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

謝謝,我使用** numpy-1.7.1-py2.7-win32.egg **,它不喜歡'nanmean'拋出錯誤:''module'對象沒有屬性'nanmean'。 (我剛剛檢查過,'nanmean'是verison 1.8.0中的新增功能 – Rhubarb 2014-10-02 07:06:56

+0

但是'np.nansum'似乎也在版本1.8.0中添加了。很奇怪我沒有得到相同的錯誤... – Rhubarb 2014-10-02 07:15:05

+0

感謝Korem,我試過這個,但它沒有工作,我編輯了我的問題,並給出了錯誤信息。另外,默認情況下,pd.Series.mean不是'skipna = True'? – Rhubarb 2014-10-02 08:53:27