【问题标题】:Replace unwanted value with the preceding value in the list用列表中的前一个值替换不需要的值
【发布时间】:2017-04-01 07:43:26
【问题描述】:

我在数据框中有以下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

【问题讨论】:

  • 有逻辑吗?比如两行之间的差异不应超过某个阈值等?
  • 没有这样的逻辑,Kartik。我可以在 01 之后立即获得信号 51 - 但是,我必须清理/替换意外值。它应该是 1、2 等的系列。

标签: python loops pandas replace


【解决方案1】:

此代码可以解决问题...假设确定 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)

【讨论】:

  • Pab,如果 id 是递增顺序,这将解决。我可能有[51,51,1,51,51,1,1,2,1,1,1,48,48,2,48]
  • 你如何定义这个id是“不正确的”?还是需要删除?是在黑名单上还是不在白名单上的ID?是方差吗?是非连续出现吗?
  • 其非连续出现 - 偏离有效信号。
  • 我修改了运行在两个示例组合上的代码。它可以处理一个或两个不连续的项目......
  • 谢谢你,Prob。这真的很有帮助!
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多