我有一些传感器读数的大数据集,其中偶尔行将是0。启发式非常简单:如果前一行和下一行不是0,我假设这是一个传感器故障,我用它周围两行的平均值替换这一行。你知道吗
在某些情况下,传感器读数可能为0,因此仅查看0是不可行的。你知道吗
到目前为止,我想出了以下清理方法:
data["x+1"] = data["x"].shift(1)
data["x+2"] = data["x"].shift(2)
res = data[["x", "x+1", "x+2"]].apply(
lambda x : (x[0] + x[2])/2
if ((x[0] > 0) and (x[1] <= 0) and (x[2] > 0) )
else x[1], axis=1 )
data[x] = res.shift(-1)
这在原则上是可行的,我更喜欢在3个压缩和移位的数据帧上迭代,比如:
for row1, row2, row3 in zip( data.iterrows(), data.shift(1).iterrows(), data.shift(2).iterrows() ):
...
然而,这两种方法都需要一个漫长的过程。我读到apply
不能矢量化,内存中有一些重复(输出)。你知道吗
我也试过以下方法,但效果不佳:
data.loc[ data["x"] == 0 , "x" ] = np.NaN
data["x"].fillna( method="ffill", limit=1, inplace=True)
data["x"].fillna( 0 )
这是闪电般的快,但没有做我希望它做的事情(它只是停止填充超过第一个NaN,而我希望它填充只有如果有一个NaN)
我不知道我能做些什么来让这个解决方案扩展到千兆字节的文件。我目前正在使用awk
来运行这些文件,但这并不理想,因为代码的可维护性较差,而且python程序中已经有大量其他类似的预处理。你知道吗
任何建议都将不胜感激。你知道吗
可以使用where函数将其矢量化:
有输入:
提供:
或者,您可以创建一个逻辑索引来指示应该替换值的位置,并将上一行和下一行中的值的平均值分配给它们:
相关问题 更多 >
编程相关推荐