假设我是一个农民...而且我经常每一次都到田间去摘所有成熟的苹果,梨和李子。我跟踪每天在称为pick_counts的数据框中选择了多少个:

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的填充方法(不存在)。有什么想法吗?

最佳答案

您将如何定义降雨期?例如,在这里我将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

10-07 18:25