【问题标题】:Find max since condition in pandas timeseries dataframe在熊猫时间序列数据框中查找最大自条件
【发布时间】:2013-10-31 19:36:09
【问题描述】:

我正在尝试找到最大值,因为在熊猫数据框中条件为真。我搜索了类似的问题并阅读了文档,但未能找到讨论的这个问题。为了说明,我想要一个返回 maxsince 列的函数。

In [84]: df
Out[84]: 
                     a      b  maxsince
2007-04-27 11:00:00  1   True         1
2007-04-27 11:30:00  5  False         5
2007-04-27 12:00:00  3  False         5
2007-04-27 12:30:00  2   True         2
2007-04-27 13:00:00  2  False         2
2007-04-27 13:30:00  7   True         7
2007-04-27 14:00:00  3  False         7
2007-04-27 14:30:00  4  False         7

如果不使用循环,我无法计算这个。什么是最有效的方法?谢谢。

【问题讨论】:

  • df.groupby('b').max() 你在找什么?
  • 不,我正在寻找类似 cummax() 的东西,它会在 'b' 中的每个 True 上重置。

标签: python numpy pandas


【解决方案1】:

怎么样:

>>> df.groupby(df["b"].cumsum())["a"].cummax()
2007-04-27  11:00:00    1
            11:30:00    5
            12:00:00    5
            12:30:00    2
            13:00:00    2
            13:30:00    7
            14:00:00    7
            14:30:00    7
dtype: int64

这是因为

>>> df["b"].cumsum()
2007-04-27  11:00:00    1
            11:30:00    1
            12:00:00    1
            12:30:00    2
            13:00:00    2
            13:30:00    3
            14:00:00    3
            14:30:00    3
Name: b, dtype: int32

每当我们看到True 时都会给我们一个新值。当第一个值为False 时,您可能需要根据您想要发生的情况对其进行一些修补,但我将把它作为练习留给读者。 ;^)

【讨论】:

  • 不错的一个。食谱值得吗?
  • +1 我想过用 pd.rolling_apply 做这个然后分组,但是这个显然更好
  • 你用的是什么版本的熊猫? 0.12.0 版给了我 ValueError: cannot convert float NaN to integer when I try df["b"].cumsum().
  • 啊。我正在使用'0.12.0-559-ga11e143'。你可以简单地做df["b"].astype(int).cumsum()(df["b"]*1).cumsum() 来解决这个问题。 (我没有 0.12 容易获得,不好意思,所以你可能不得不把它设为 float 太难猜了。)
  • 好的,它开始工作了。感谢你的回答。希望我能想到这一点。
猜你喜欢
  • 2021-09-13
  • 2021-11-10
  • 2020-09-18
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多