【问题标题】:Find pattern with defined start and end, but with unknown length查找具有定义的开始和结束但长度未知的模式
【发布时间】:2018-10-30 19:05:57
【问题描述】:

本质:

这是Find particular pattern in a pandas dataframe 的后续问题,但现在我不是在寻找固定模式。那么如何定义模式/时间段的特定开始和结束,并据此对 pandas 数据帧进行子集化呢?

详情:

假设你有这个数据框:

            ColA  ColB
Dates                 
2017-07-07   103    92
2017-07-08    92    96
2017-07-09   107   109
2017-07-10   100    91
2017-07-11    90   107
2017-07-12   105    99
2017-07-13    90   104
2017-07-14    90   105
2017-07-15   109   104
2017-07-16    94    90

假设您要查找的模式以ColA 中的[107, 100] 开头,并在同一列中以[90, 109] 结尾(ColB 只是为了说明它是一个数据框而不是一个系列)。如何在不知道它们之间存在多少观察值的情况下对数据框进行子集化?

期望的输出:

            ColA  ColB
Dates                 
2017-07-09   107   109
2017-07-10   100    91
2017-07-11    90   107
2017-07-12   105    99
2017-07-13    90   104
2017-07-14    90   105
2017-07-15   109   104

我知道如何使用嵌套的 for 循环以基本的方式做到这一点,但我希望你们中的一些人有一个更优雅的解决方案。感谢您的任何建议!

【问题讨论】:

  • 您能否再澄清一下开头和结尾?它们是 ColA 和 ColB 的范围吗?最后一次观察是 109,它落在 107 之后。
  • 该模式仅限于 ColA。添加 ColB 只是为了说明它是一个数据框而不是一个系列。

标签: python pandas


【解决方案1】:

对于几个值,您可以使用pd.Series.shift。您将需要额外的逻辑来解释idx2 发生之前 idx1,并概括任意相邻值。

idx1 = (df['ColA'].eq(107) & df['ColA'].shift(-1).eq(100)).idxmax()
idx2 = (df['ColA'].shift().eq(90) & df['ColA'].eq(109)).idxmax()

print(df.loc[idx1: idx2])

            ColA  ColB
Dates                 
2017-07-09   107   109
2017-07-10   100    91
2017-07-11    90   107
2017-07-12   105    99
2017-07-13    90   104
2017-07-14    90   105
2017-07-15   109   104

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2020-10-30
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多