使用插值法清除列内的离群值
Cleaning outliers inside a column with interpolation
我正在尝试执行以下操作。
我在数据框中有一些值错误的数据(x<=0
或 x>=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 确保第一项和最后一项在需要时也被替换,分别替换为第二项和倒数第二项。如果您想要第一项和最后一项的一些更高级的策略,您需要自己编写。
我正在尝试执行以下操作。
我在数据框中有一些值错误的数据(x<=0
或 x>=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 确保第一项和最后一项在需要时也被替换,分别替换为第二项和倒数第二项。如果您想要第一项和最后一项的一些更高级的策略,您需要自己编写。