本质:
这是Find particular pattern in a pandas dataframe的后续问题,但是现在我没有在寻找固定模式。那么如何定义特定的开始和结束的模式/时间段,并据此子集熊猫数据帧?
详细信息:
假设您有此数据框:
trim()
假设您要查找的模式在$rows = explode(PHP_EOL, $str);
foreach ($rows as $row){
$rowParts = explode(':', $row);
$fieldName = trim($rowParts[0]);
$fieldValue = trim($rowParts[1]);
}
中以 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
开头,并在同一列中以[107, 100]
结尾(ColB只是为了说明它是一个数据帧,不是系列)。在不知道它们之间有多少观察值的情况下,如何对数据框进行子集化?
所需的输出:
ColA
我知道如何使用嵌套的for循环以简单的方式执行此操作,但是我希望其中一些人能找到更优雅的解决方案。谢谢您的任何建议!
答案 0 :(得分:1)
对于几个值,可以使用pd.Series.shift
。您将需要额外的逻辑来说明在{em>之前 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