【问题标题】:Rolling min of a Pandas Series without window / cumulative minimum / expanding min无窗口熊猫系列的滚动最小值/累积最小值/扩展最小值
【发布时间】:2019-11-01 21:32:39
【问题描述】:

我正在寻找一种使用 Python Pandas rolling(*) min of a Series without window 计算的方法。

让我们考虑以下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

并给出正确答案

In [30]: r
Out[30]:
0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

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

(*)“滚动”可能不是合适的术语,也许应该将其命名为“本地”分钟。

编辑:实际上它被命名为累积最小值或扩展最小值

【问题讨论】:

    标签: python pandas min accumulate


    【解决方案1】:

    使用Series.cummin:

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

    【讨论】:

    • 有没有办法同时索引最小值?
    • @EduardoReis - 你认为s1 = s.cummin() 然后s1.index = s1.index.to_series().groupby(s1.ne(s1.shift()).cumsum()).transform('first')
    【解决方案2】:

    你可以使用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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 很奇怪s.expanding().min() 不保留类型(但将int64 转换为float64
      猜你喜欢
      • 2020-03-26
      • 2017-08-27
      • 2020-06-21
      • 2020-04-28
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2022-06-10
      • 2012-05-30
      相关资源
      最近更新 更多