“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个极限而已。”
异常值(空值)处理
Pandas:isnull()和duplicated()
1.直接丢弃(包括重复数据)
Pandas:drop()/dropna()/drop_duplicated()
2.插值替代
Pandas:interpolate()----Series
df = pd.DataFrame({"A": ["a0","a1","a1","a2","a3","a4"],"B": ["b0","b1","b2","b2","b3", None],
"C": [1,2, None,3,4,5],"D": [0.1,10.2,11.4,8.9,9.1,12],"E": [10,19,32,25,8, None],
"F": ["f0","f1","g2","f3","f4","f5"]})
print(df)
A B C D E F
0 a0 b0 1.0 0.1 10.0 f0
1 a1 b1 2.0 10.2 19.0 f1
2 a1 b2 NaN 11.4 32.0 g2
3 a2 b2 3.0 8.9 25.0 f3
4 a3 b3 4.0 9.1 8.0 f4
5 a4 None 5.0 12.0 NaN f5
如上数据中字符为空的用None,数值为空的用NaN表示,现在删除列属性B,C中为空的所在行数据:
print(df.dropna(subset=["B","C"]))
A B C D E F
0 a0 b0 1.0 0.1 10.0 f0
1 a1 b1 2.0 10.2 19.0 f1
3 a2 b2 3.0 8.9 25.0 f3
4 a3 b3 4.0 9.1 8.0 f4
如果要删除所有的列属性中有空值的行可用
print(df.dropna())
如果只想删除列属性A中具有重复值的行可用如下命令
print(df.drop_duplicates(["A"],keep="last")) #keep="last" 表示保留A属性重复值中的最后一行
A B C D E F
0 a0 b0 1.0 0.1 10.0 f0
2 a1 b2 NaN 11.4 32.0 g2
3 a2 b2 3.0 8.9 25.0 f3
4 a3 b3 4.0 9.1 8.0 f4
5 a4 None 5.0 12.0 NaN f5
现在对空值进行插值:
如果我们用均值进行填值,例如对列属性E的空值填入其均值
df["E"]=df["E"].fillna(df["E"].mean())
print(df)
A B C D E F
0 a0 b0 1.0 0.1 10.0 f0
2 a1 b2 NaN 11.4 32.0 g2
3 a2 b2 3.0 8.9 25.0 f3
4 a3 b3 4.0 9.1 8.0 f4
5 a4 None 5.0 12.0 18.8 f5
也可以用三次样条函数进行插值:
df["E"]=df["E"].interpolate(method="spline",order=3)
print(df)
A B C D E F
0 a0 b0 1.0 0.1 10.000000 f0
1 a1 b1 2.0 10.2 19.000000 f1
2 a1 b2 NaN 11.4 32.000000 g2
3 a2 b2 3.0 8.9 25.000000 f3
4 a3 b3 4.0 9.1 8.000000 f4
5 a4 None 5.0 12.0 -20.143603 f5
观察D属性列,发现第一行为0.1,与其余五行貌似不在一个数量级上,也有可能是异常值,现在我们用四分位数确定上下界的方法进行过滤:
upper_q=df["D"].quantile(0.75)
lower_q = df["D"].quantile(0.25)
q_int=upper_q-lower_q
k=1.5
df1=df[df["D"]>lower_q-k*q_int][df["D"]
print(df1)
A B C D E F
1 a1 b1 2.0 10.2 19.0 f1
2 a1 b2 NaN 11.4 32.0 g2
3 a2 b2 3.0 8.9 25.0 f3
4 a3 b3 4.0 9.1 8.0 f4
5 a4 None 5.0 12.0 NaN f5
则第一行就被删除了。
领取专属 10元无门槛券
私享最新 技术干货