我有一个像这样的数据集:
price is_peak is_valley
2018-08-25 01:47:00+00:00 0.041838 True False
2018-08-25 05:21:00+00:00 0.041620 True False
2018-08-25 09:11:00+00:00 0.041599 True False
2018-08-25 12:37:00+00:00 0.041670 True False
所有行都是is_peak = True或is_valley = True
我该如何过滤以删除其中的行: -前一行是峰值,当前行是峰值;要么 -前一行是山谷,当前行是山谷?
我尝试了以下操作:
merged = pd.concat([ peakT, valleyT ])
mask = (merged['is_valley'] & merged.shift(-1)['is_valley'] == False) | (merged['is_peak'] & merged.shift(-1)['is_peak'] == False)
merged[ mask ]
答案 0 :(得分:2)
因为所有行都是is_peak = True或is_valley = True ,所以您可以使用ne
搜索is_peak
与上一行不同的地方:
df.loc[df.is_peak.ne(df.is_peak.shift())]
答案 1 :(得分:1)
回答您的问题,以便您理解逻辑:
df[~((df['is_peak'] & df['is_peak'].shift()) # Previous row is a peak and the current row is a peak.
| (df['is_valley'] & df['is_valley'].shift()))] # OR the previous row is a valley and the current row is a valley.
~
字符使掩码反转,因此它返回不符合条件的所有内容。
条件的逻辑是((A和B)或(C和D))。请注意,&
是按位AND,而|
是按位OR。