2014-04-23 57 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

我认为这与我的相同,请参阅编辑第一行的内容: –