将不需要的值替换为列表中的前一个值

时间:2016-11-17 16:42:00

标签: python loops pandas replace

我在数据框(signalId)中有以下df。我试图在替换不需要的signalId的时候平滑这个信号

在以下示例中, a)第6个ID 03应替换为01 b)第12和第13(分别为0405)应替换为02

01
01
01
01
01
03
01
01
02
02
02
04
05
02
02
02

如果我知道确切的位置,我可以替换该值,但是如何循环执行此操作?

df.id.loc[6] = 01

1 个答案:

答案 0 :(得分:0)

这段代码可以解决问题......假设确定3,4,5无效的逻辑是它们是>比2.

您可能需要对逻辑进行一些调整以找到不合适的值,但下面的其余步骤应该有效。基本上找到无效值,设置为nan。然后ffill()结束。

import pandas as pd
import numpy as np
data = pd.Series([51,51,1,51,51,1,1,2,1,1,1,48,48,2,48,
                  1,1,1,1,3,1,1,2,2,2,4,5,2,2,2])

# answer is 2, 7, 13, 19, 25, 26

# size 1 gaps. 
# get the next value, 
data_pr = data.shift(-1)
data_nx = data.shift(1)

# % exclude the first 2 items from the filder. 
data_nx[:1]= data[:1]
data_pr[-1:] = data[-1:]
#data_lag2[:2]= data[:2]

# % find the idx where data != data_lag1 && data == data_lag2
data[(data != data_pr) & (data != data_nx) & (data_pr == data_nx) ]=np.nan
# % get invalid values that are 2 in a row... 
data_pr2 = data.shift(-2) 
data_nx2 = data.shift(2)   
data[(data != data_pr) & (data != data_nx) & (data_pr2 == data_nx2) ]=np.nan
# %
assert (data[data.isnull()].index.values == np.array([2,7,13,19,25,26])).all()
data.ffill(inplace=True)