2014-04-23 52 views
1

說我是農民......每隔一段時間我都會到我的田野去挑選所有成熟的蘋果,梨和李子。我跟蹤一個名爲pick_counts數據幀我的每一天有多少各挑:重建索引熊貓DataFrame與總和而不是bfill或ffill

import pandas as pd 
import numpy as np 

np.random.seed(0) 

pick_counts = pd.DataFrame(np.random.randint(0, 20, [10,3]), 
        index=pd.date_range('8/16/2004', periods=10, freq='D'), 
        columns=['apples', 'pears', 'plums']) 

在我的農場,我有測量降雨量杯。而且每隔一段時間,我就檢查自從我上次閱讀以來有多少降雨......即,每次我檢查杯子裏的降雨量時,我都會傾倒出水來「重置」。我存儲在一系列我降雨讀數稱爲rainfall

rainfall = pd.Series(np.random.rand(4), 
        index=pd.date_range('8/16/2004 12:15PM', 
             periods=4, 
             freq='80H')) 

現在,作爲一個合理的農民,我想看看,如果降雨量超過某一時期對我在這期間挑選每種水果的數量產生任何影響。所以我想製作一個數據幀,其中列['apples', 'pears', 'plums', 'rainfall']和行是從rainfall日期。在水果專欄中,我希望看到每行所示時間與前一行所示時間之間的水果總數。即每行將包含自上一行以來降雨量下降的數據以及自上一行以來每種水果的多少。

什麼是正確的方法來解決這個問題?

我想我想做一些像reindex但使用sum(它不存在)的填充方法。思考?

回答

2

你打算如何定義降雨期?在這裏例如,我有8-16作爲一個,8-17到8-19作爲第二個,依此類推。

In [38]: 

pick_counts['period']=(pick_counts.index.values>=rainfall.index.values[...,np.newaxis]).sum(0) 
gbdf=pick_counts.groupby('period').sum() 
gbdf.index=rainfall.index 
gbdf['rainfall']=rainfall 
print gbdf 
        apples pears plums rainfall 
2004-08-16 12:15:00  12  15  0 0.799159 
2004-08-19 20:15:00  16  28  37 0.461479 
2004-08-23 04:15:00  47  47  40 0.780529 
2004-08-26 12:15:00  5  33  18 0.118274 

[4 rows x 4 columns] 

什麼一號線正在做的是創造期間一列:

In [113]: 

print pick_counts 
      apples pears plums period 
2004-08-16  12  15  0  0 
2004-08-17  3  3  7  1 
2004-08-18  9  19  18  1 
2004-08-19  4  6  12  1 
2004-08-20  1  6  7  2 
2004-08-21  14  17  5  2 
2004-08-22  13  8  9  2 
2004-08-23  19  16  19  2 
2004-08-24  5  15  15  3 
2004-08-25  0  18  3  3 

[10 rows x 4 columns] 

而且rainfall DF是這樣的:

In [114]: 

print rainfall 
2004-08-16 12:15:00 0.799159 
2004-08-19 20:15:00 0.461479 
2004-08-23 04:15:00 0.780529 
2004-08-26 12:15:00 0.118274 
Freq: 80H, dtype: float64 
+0

我所界定的降雨週期爲該時間嚴格大於前一次直到當前時間(包括)。即第一階段是從時間的開始到第一階段的時間。第二階段,如果從嚴格的第一次到第二次包括第二次。那有意義嗎? – 8one6

+0

你能解釋一下你在'pick_counts ['period'] = ...'行中做了什麼嗎? – 8one6

+0

我認爲這與我的相同,請參閱編輯第一行的內容: –