2012-07-12 54 views
5

我需要將Python中的十進制類型值存儲在一個pandas TimeSeries/DataFrame對象中。在TimeSeries/DataFrame上使用「groupby」和「mean」時,熊貓給了我一個錯誤。基於彩車下面的代碼工作得很好:如何在帶有Decimal類型值的pandas TimeSeries上使用平均方法?

[0]: by = lambda x: lambda y: getattr(y, x) 

[1]: rng = date_range('1/1/2000', periods=40, freq='4h') 

[2]: rnd = np.random.randn(len(rng)) 

[3]: ts = TimeSeries(rnd, index=rng) 

[4]: ts.groupby([by('year'), by('month'), by('day')]).mean() 
2000 1 1 0.512422 
     2 0.447235 
     3 0.290151 
     4 -0.227240 
     5 0.078815 
     6 0.396150 
     7 -0.507316 

但是,如果做同樣的使用十進制值,而不是花車我得到一個錯誤:

[5]: rnd = [Decimal(x) for x in rnd]  

[6]: ts = TimeSeries(rnd, index=rng, dtype=Decimal) 

[7]: ts.groupby([by('year'), by('month'), by('day')]).mean() #Crash! 

Traceback (most recent call last): 
File "C:\Users\TM\Documents\Python\tm.py", line 100, in <module> 
print ts.groupby([by('year'), by('month'), by('day')]).mean() 
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 293, in mean 
return self._cython_agg_general('mean') 
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 365, in _cython_agg_general 
raise GroupByError('No numeric types to aggregate') 
pandas.core.groupby.GroupByError: No numeric types to aggregate 

的錯誤消息是「GroupByError('沒有數字類型彙總')「。是否有機會在包含Decimal值的TimeSeries或DataFrame上使用標準聚合,如sum,mean和quantileon?

爲什麼doens't它的工作,並有機會有一個同樣快速的選擇,如果這是不可能的?

編輯:我剛剛意識到,大部分的其他功能(最大,最小,平均等),做工精細,但並非意味着功能我迫切需要:-(

+1

我不是。當然,最近我也遇到過這個問題,我剛剛結束了將Decimal()值重新編碼爲浮點數,然後使用浮點數值創建了數據幀。 – reptilicus 2012-07-12 19:53:58

回答

11
import numpy as np 
ts.groupby([by('year'), by('month'), by('day')]).apply(np.mean) 
+0

工作正常!謝謝EMS! – THM 2012-07-13 03:57:47

+0

@ThomasM也鼓勵用戶提供幫助你應該提出答案(點擊答案左上方的向上箭頭)如果答案實際上解決了你的問題,你也應該接受它。要接受一個問題,你必須點擊下面的刻度線號碼 – kay 2012-07-14 04:21:12

+3

另外,你並不是真的需要這裏的lambda,只是喂'np.mean'也會工作,但我離開了lambda來說明如何解決這個問題,當你想申請更多的通用函數不工作以他們的默認方式。 '.apply'函數在Pandas中非常強大。 – ely 2012-07-14 15:43:15

相關問題