如下所示,my
包含一些相同的连续值,即1、2和3。
Date Value
0 2017-07-18 07:40:00 1
1 2017-07-18 07:45:00 1
2 2017-07-18 07:50:00 1
3 2017-07-18 07:55:00 2414
4 2017-07-18 08:00:00 2
5 2017-07-18 08:05:00 2
6 2017-07-18 08:10:00 4416
7 2017-07-18 08:15:00 4416
8 2017-07-18 08:20:00 3
9 2017-07-18 08:25:00 3
10 2017-07-18 08:30:00 3
11 2017-07-18 08:35:00 6998
我旨在检测这些“死值”,只要它们停留在最少3行中,并用NaN更改它们,因为我想消除它们。
这是我的尝试:
df['Value'] = df['Value'].loc[df['Value'].shift() != df['Value']]
但是它给出了:
Date Value
0 2017-07-18 07:40:00 1.0
1 2017-07-18 07:45:00 NaN
2 2017-07-18 07:50:00 NaN
3 2017-07-18 07:55:00 2414.0
4 2017-07-18 08:00:00 2.0
5 2017-07-18 08:05:00 NaN
6 2017-07-18 08:10:00 4416.0
7 2017-07-18 08:15:00 NaN
8 2017-07-18 08:20:00 3.0
9 2017-07-18 08:25:00 NaN
10 2017-07-18 08:30:00 NaN
11 2017-07-18 08:35:00 6998.0
我希望使用NaN来更改所有1和3,如下所示,因为它们连续三行的值都相似。
Date Value
0 2017-07-18 07:40:00 NaN
1 2017-07-18 07:45:00 NaN
2 2017-07-18 07:50:00 NaN
3 2017-07-18 07:55:00 2414.0
4 2017-07-18 08:00:00 2.0
5 2017-07-18 08:05:00 2.0
6 2017-07-18 08:10:00 4416.0
7 2017-07-18 08:15:00 4416.0
8 2017-07-18 08:20:00 NaN
9 2017-07-18 08:25:00 NaN
10 2017-07-18 08:30:00 NaN
11 2017-07-18 08:35:00 6998.0
我想使用导数。即,如果连续3行的差值<0.0001,则用NaN进行更改。
答案 0 :(得分:1)
您可以使用自定义分组方案来GroupBy
个连续值,检查哪些组的大小大于或等于3
,然后使用结果为数据帧建立索引并将感兴趣的行设置为{{ 1}}:
NaN
位置:
g = df.Value.diff().fillna(0).ne(0).cumsum()
m = df.groupby(g).Value.transform('size').ge(3)
df.loc[m,'Value'] = np.nan
Date Value
0 2017-07-18-07:40:00 NaN
1 2017-07-18-07:45:00 NaN
2 2017-07-18-07:50:00 NaN
3 2017-07-18-07:55:00 2414.0
4 2017-07-18-08:00:00 2.0
5 2017-07-18-08:05:00 2.0
6 2017-07-18-08:10:00 4416.0
7 2017-07-18-08:15:00 4416.0
8 2017-07-18-08:20:00 NaN
9 2017-07-18-08:25:00 NaN
10 2017-07-18-08:30:00 NaN
11 2017-07-18-08:35:00 6998.0
答案 1 :(得分:0)
计算值。结果是一个系列,它需要一个名称以供进一步参考:
counts = df['Value'].value_counts()
counts.name = '_'
将系列中的选择值与原始数据框合并:
keep = counts[counts < 3]
df.merge(keep, left_on='Value', right_index=True)[df.columns]
# Date Value
#3 2017-07-18 07:55:00 2414
#4 2017-07-18 08:00:00 2
#5 2017-07-18 08:05:00 2
#6 2017-07-18 08:10:00 4416
#7 2017-07-18 08:15:00 4416
#11 2017-07-18 08:35:00 6998
结果是经过过滤的数据框。
如果您使用的熊猫版本<0.24,则应进行升级,但这是一种解决方法:
df.merge(pd.DataFrame(keep), left_on='Value', right_index=True)[df.columns]