需要迭代的数据清理1.数据帧一次三排

2024-04-26 10:40:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些传感器读数的大数据集,其中偶尔行将是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程序中已经有大量其他类似的预处理。你知道吗

任何建议都将不胜感激。你知道吗


Tags: and文件数据方法datashiftres传感器
1条回答
网友
1楼 · 发布于 2024-04-26 10:40:50

可以使用where函数将其矢量化:

preV = data['x'].shift(1)
nexT = data['x'].shift(-1)
data['x'] = data['x'].where((data['x'] > 0) | (preV <= 0) | (nexT <= 0), (preV + nexT)/2)

有输入:

data = pd.DataFrame({"x": [1,2,3,0,0,2,3,0,4,2,0,0,0,1]})

提供:

0     1.0
1     2.0
2     3.0
3     0.0
4     0.0
5     2.0
6     3.0
7     3.5              # 0 gets replaced here
8     4.0
9     2.0
10    0.0
11    0.0
12    0.0
13    1.0
Name: x, dtype: float64

或者,您可以创建一个逻辑索引来指示应该替换值的位置,并将上一行和下一行中的值的平均值分配给它们:

data.loc[(data['x'] <= 0) & (preV > 0) & (nexT > 0), "x"] = (preV + nexT)/2

相关问题 更多 >