本质:
这是在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