使用插值法清除列内的离群值

Cleaning outliers inside a column with interpolation

我正在尝试执行以下操作。 我在数据框中有一些值错误的数据(x<=0x>=1100)。 我正在尝试将这些值更改为可接受范围内的值。

目前,这是我在代码方面所做的

def while_non_nan(A, k):
    init = k
    if k+1 >= len(A)-1:
        return A.iloc[k-1]
    while np.isnan(A[k+1]):
        k += 1
    #Calculate the value.
    n = k-init+1
    value = (n*A.iloc[init-1] + A.iloc[k])/(n+1)
    return value

evoli.loc[evoli['T1'] >= 1100, 'T1'] = np.nan
evoli.loc[evoli['T1'] <= 0, 'T1'] = np.nan
inds = np.where(np.isnan(evoli))
#Place column means in the indices. Align the arrays using take
for k in inds[0] :
    evoli['T1'].iloc[k] =  while_non_nan(evoli['T1'], k)

我将异常值转换为 nan。 之后,我得到了那些nan的位置。 最后,我将 nan 修改为前一个值和下一个值之间的平均值。 因为,几个 nan 可以彼此相邻,whie_non_nan 搜索下一个 non_nan 值并获得计算的平均值。

我希望得到的示例:

Input :
[nan 0 1 2 nan 4 nan nan 7 nan ]

Output:
[0 0 1 2 3 4 5 6 7 7 ]

希望已经足够清楚了。谢谢!

Pandas 有一个内置插值,您可以在将限制设置为 NaN:

后使用
from numpy import NaN
import pandas as pd

df = pd.DataFrame({"T1": [1, 2, NaN, 3, 5, NaN, NaN, 4, NaN]})

df["T1"] = df["T1"].interpolate(method='linear', axis=0).ffill().bfill()
print(df)

Interpolate is a DataFrame method that fills NaN values with specified interpolation method (linear in this case). Calling .bfill() for backward fill and .ffill() for forward fill 确保第一项和最后一项在需要时也被替换,分别替换为第二项和倒数第二项。如果您想要第一项和最后一项的一些更高级的策略,您需要自己编写。