如果使用Python将值随时间停留在单个值上,请使用NaN进行更改

时间:2019-03-18 16:59:49

标签: python pandas

如下所示,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进行更改。

2 个答案:

答案 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]