Я застрял на этом некоторое время. Я пытаюсь найти значение (138 в приведенном ниже примере) и следующий 0 после него - PullRequest
0 голосов
/ 17 марта 2020
     TimeStamp         Value
2014-12-19 12:41:54     0
2014-12-19 13:10:44     138
2014-12-19 13:12:45     0
2014-12-19 21:03:09     4
2014-12-20 04:53:29     138
2014-12-20 12:43:54     6
2014-12-20 13:12:46     0

Desired Output

    TimeStamp         Value
2014-12-19 13:10:44     138
2014-12-19 13:12:45     0
2014-12-20 04:53:29     138
2014-12-20 13:12:46     0

Итак, я попытался заполнить шаблон как [138,0] и найти его в столбце, он работает, но пропускает некоторые значения, где 138 непосредственно не следует за 0. (Как показано в примере выше) Есть ли способ сделать это?

pattern = [138,0] 
matched = pd.DataFrame(Data["Value"].rolling(len(pattern)).apply(lambda x: all(np.equal(x, pattern))))
matched = matched.sum(axis = 1).astype(bool)  
idx_matched = np.where(matched)[0]
subset = [range(match-len(pattern)+1, match+1) for match in idx_matched]
result = pd.concat([Data.iloc[subs,:] for subs in subset], axis = 0)

1 Ответ

0 голосов
/ 17 марта 2020

Только первый фильтр 138 или 0 значения по Series.isin с boolean indexing:

df = df[df['Value'].isin([138, 0])]

А затем фильтр [138, 0] шаблон с Series.eq для равных цепочек с & для побитового И с Series.shift:

m1 = df['Value'].eq(138) & df['Value'].shift(-1).eq(0)
m2 = df['Value'].eq(0) & df['Value'].shift().eq(138)
df = df[m1 | m2]
print (df)
             TimeStamp  Value
1  2014-12-19 13:10:44    138
2  2014-12-19 13:12:45      0
4  2014-12-20 04:53:29    138
6  2014-12-20 13:12:46      0

Если необходимо тестирование шаблона по датам, используйте только DataFrameGroupBy.shift с группировкой по Series.dt.date:

m1 = df['Value'].eq(138) & df.groupby(df['TimeStamp'].dt.date)['Value'].shift(-1).eq(0)
m2 = df['Value'].eq(0) & df.groupby(df['TimeStamp'].dt.date)['Value'].shift().eq(138)
df = df[m1 | m2]
print (df)
            TimeStamp  Value
1 2014-12-19 13:10:44    138
2 2014-12-19 13:12:45      0
4 2014-12-20 04:53:29    138
6 2014-12-20 13:12:46      0
...