不含窗口的熊猫系列的滚动分钟/累计最小值/扩展分钟

时间:2019-06-19 07:53:31

标签: python pandas min accumulate cumulative-min

我正在寻找一种使用Python Pandas在没有窗口的系列中滚动(*)分钟的方法。

让我们考虑以下sed -i "s/logstash-codec-line.3*/logstash-codec-line\ \(3.0.2\)/" file

Series

我想要一个类似的系列

In [26]: s = pd.Series([10, 12, 14, 9, 10, 8, 16, 20])
Out[26]:
0    10
1    12
2    14
3     9
4    10
5     8
6    16
7    20
dtype: int64

我尝试过

0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

但是出现以下错误

s.rolling().min()

我做到了

TypeError: rolling() missing 1 required positional argument: 'window'

并给出正确答案

r = s.copy()
val_min = r.iloc[0]
for i, (idx, val) in enumerate(r.iteritems()):
    if i > 0:
        if val < val_min:
            val_min = val
        else:
            r[idx] = val_min

但是我认为Pandas方法可能应该存在(并且效率要高得多),或者如果不存在,则应该实现它。

(*)“滚动”可能不是一个合适的术语,也许应该改为“本地”最小值。

编辑:事实上,它被称为累积最小值或扩展最小值

3 个答案:

答案 0 :(得分:7)

使用Series.cummin

print(s.cummin())
0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

答案 1 :(得分:3)

您可以使用np.minimum.accumulate

import numpy as np

pd.Series(np.minimum.accumulate(s.values))

0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

答案 2 :(得分:3)

另一种方法是使用s.expanding.min(请参见Series.expanding):

s.expanding().min()

输出:

0    10.0
1    10.0
2    10.0
3     9.0
4     9.0
5     8.0
6     8.0
7     8.0