Pandas 我已经在这上面呆了一段时间了。我试图找到一个值(在下面的例子中是138)和它后面的下一个0
所以我尝试将一个模式整为[138,0],并在列中查找它,它可以工作,但跳过了一些值,其中138后面没有直接跟0。(如上例所示)有什么方法可以做到这一点吗Pandas 我已经在这上面呆了一段时间了。我试图找到一个值(在下面的例子中是138)和它后面的下一个0,pandas,data-analysis,Pandas,Data Analysis,所以我尝试将一个模式整为[138,0],并在列中查找它,它可以工作,但跳过了一些值,其中138后面没有直接跟0。(如上例所示)有什么方法可以做到这一点吗 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
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)
df = df[df['Value'].isin([138, 0])]
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
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