Skip to main content
 首页 » 编程设计

python之Numpy, Pandas : what is the fastest way to calculate dataset row value basing on previous N values

2025年05月04日14kerrycode

我有一个数据集,我想丰富它。我需要计算一些新的数据集列,它是另一列的前 N ​​行的函数。

举个例子,假设我想计算二进制列,显示当前一天的温度是否高于前 N 天的平均温度。

目前我只是使用 df.iterrows() 遍历所有 pandas 数据集值并进行适当的计算。这需要一些时间。有没有更好的选择?

请您参考如下方法:

使用rolling/moving window functions .

示例 DF:

In [46]: df = pd.DataFrame({'date':pd.date_range('2000-01-01', freq='D', periods=15), 'temp':np.random.rand(15)*20}) 
 
In [47]: df 
Out[47]: 
         date       temp 
0  2000-01-01  17.246616 
1  2000-01-02  18.228468 
2  2000-01-03   6.245991 
3  2000-01-04   8.890069 
4  2000-01-05   6.837285 
5  2000-01-06   1.555924 
6  2000-01-07  18.641918 
7  2000-01-08   6.308174 
8  2000-01-09  13.601203 
9  2000-01-10   6.482098 
10 2000-01-11  15.711497 
11 2000-01-12  18.690925 
12 2000-01-13   2.493110 
13 2000-01-14  17.626622 
14 2000-01-15   6.982129 

解决方法:

In [48]: df['higher_3avg'] = df.rolling(3)['temp'].mean().diff().gt(0) 
 
In [49]: df 
Out[49]: 
         date       temp  higher_3avg 
0  2000-01-01  17.246616        False 
1  2000-01-02  18.228468        False 
2  2000-01-03   6.245991        False 
3  2000-01-04   8.890069        False 
4  2000-01-05   6.837285        False 
5  2000-01-06   1.555924        False 
6  2000-01-07  18.641918         True 
7  2000-01-08   6.308174        False 
8  2000-01-09  13.601203         True 
9  2000-01-10   6.482098        False 
10 2000-01-11  15.711497         True 
11 2000-01-12  18.690925         True 
12 2000-01-13   2.493110        False 
13 2000-01-14  17.626622         True 
14 2000-01-15   6.982129        False 

解释:

In [50]: df.rolling(3)['temp'].mean() 
Out[50]: 
0           NaN 
1           NaN 
2     13.907025 
3     11.121509 
4      7.324448 
5      5.761093 
6      9.011709 
7      8.835339 
8     12.850431 
9      8.797158 
10    11.931599 
11    13.628173 
12    12.298511 
13    12.936886 
14     9.033954 
Name: temp, dtype: float64