查找已定义开始和结束,但长度未知的模式



本质:

这是在pandas数据帧中查找特定模式的后续问题,但现在我不寻找固定的模式。那么,如何定义模式/时间段的特定开始和结束,并根据该开始和结束定义panda数据帧的子集呢?

详细信息:

假设您有这样的数据帧:

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循环以一种基本的方式来实现这一点,但我希望你们中的一些人有一个更优雅的解决方案。谢谢你的建议!

对于几个值,可以使用pd.Series.shift。您将需要额外的逻辑来解释在idx1之前出现的idx2,以及对任意相邻值进行泛化。

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

最新更新