数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
isnull 函数的使用:判断数据集中是否存在缺失值或者空值
import pandas as pd
import numpy as np
ser_obj = pd.Series([1,None,np.NaN])
print(ser_obj)
'''
0 1.0
1 NaN
2 NaN
dtype: float64
'''
pd.isnull(ser_obj)
'''
0 False
1 True
2 True
dtype: bool
'''
pd.notnull(ser_obj)
'''
0 True
1 False
2 False
dtype: bool
'''
ser_obj.dropna()
'''
0 1.0
dtype: float64
'''
空值和缺失值的处理
如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:
- axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
- how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。
- thresh:设置需要多少非空值的数据才可以保留下来的。
- subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
- inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
series_obj = pd.DataFrame([['小说',np.NaN,'老舍'],
['散文笔记','《皮囊》',None],
['青春文学','《旅程结束时》','张其鑫'],
['传记','《老舍自传》','老舍']],columns=['类型','书名','作者'])
print(series_obj)
'''
类型 书名 作者
0 小说 NaN 老舍
1 散文笔记 《皮囊》 None
2 青春文学 《旅程结束时》 张其鑫
3 传记 《老舍自传》 老舍
'''
print(series_obj.dropna())
'''
类型 书名 作者
2 青春文学 《旅程结束时》 张其鑫
3 传记 《老舍自传》 老舍
'''
填充缺失值
df_obj = pd.DataFrame([[1.0,np.NaN,'a',np.NaN],
[2.0,4.0,7,2.0],
[3.0,None,8,3.0],
[np.NaN,6.0,9,np.NaN]],columns=['A','B','C','D'])
print(df_obj)
'''
A B C D
0 1.0 NaN a NaN
1 2.0 4.0 7 2.0
2 3.0 NaN 8 3.0
3 NaN 6.0 9 NaN
'''
print(df_obj.fillna('66.0'))
'''
A B C D
0 1 66.0 a 66.0
1 2 4 7 2
2 3 66.0 8 3
3 66.0 6 9 66.0
'''
- duplicated(subset=None,keep=‘first’) 方法用于标记是否有重复值
- drop_duplicates(subset=None,keep=‘first’,inplace=False) 方法用于删除重复值
import numpy as np
import pandas as pd
df = pd.DataFrame({'id':[1,2,3,4,4,5],
'name':['小铭','小月月','彭岩','刘华','刘华','周华'],
'age':[18,18,29,58,58,36],
'height':[180,180,185,175,175,178],
'gender':['女','女','男','男','男','男']})
print(df)
'''
id name age height gender
0 1 小铭 18 180 女
1 2 小月月 18 180 女
2 3 彭岩 29 185 男
3 4 刘华 58 175 男
4 4 刘华 58 175 男
5 5 周华 36 178 男
'''
print(df.duplicated(keep='first'))
'''
0 False
1 False
2 False
3 False
4 True
5 False
dtype: bool
'''
print(df.duplicated(keep='last'))
'''
0 False
1 False
2 False
3 True
4 False
5 False
dtype: bool
'''
print(df.drop_duplicates(keep='first'))
'''
id name age height gender
0 1 小铭 18 180 女
1 2 小月月 18 180 女
2 3 彭岩 29 185 男
3 4 刘华 58 175 男
5 5 周华 36 178 男
'''
异常值的处理
3σ原则
3σ原则,又称为拉依达原则,它是指假设一组检测数据只含有随机误差,对其进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间的误差都是粗大误差,在此误差的范围内的数据应予以剔除。
正态分布
在正态分布概率公式中,σ表示标准差,μ表示平均数,f(x)表示正态分数函数,具体如下:
f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^-\frac{(x-\mu)^2}{2\sigma^2} f(x)=2πσ1e−2σ2(x−μ)2
数值几乎全部集中在(μ-3σ,μ+3σ)]区间内,超出这个范围的可能性仅占不到0.3%。所以,凡是误差超过这个区间的就属于异常值,应予以剔除。
箱型图
箱形图是一种用作显示一组数据分散情况的统计图。在箱形图中,异常值通常被定义为小于QL – 1.5QR或大于QU + 1.5IQR的值。
异常值替换
replace()方法不仅可以对单个数据进行替换,也可以多个数据执行批量替换操作。
replace(to_replace = None,value = None,inplace = False,limit = None,regex = False,method =‘pad’ )
to_replace:表示查找被替换值的方式。
value:用来替换任何匹配to_replace的值,默认值None。
df = pd.DataFrame({'菜谱名':['红烧肉','铁板鱿鱼','小炒肉','干锅鸭掌','酸菜鱼'],
'价格':[39,30,26,388,35]})
print(df)
'''
菜谱名 价格
0 红烧肉 39
1 铁板鱿鱼 30
2 小炒肉 26
3 干锅鸭掌 388
4 酸菜鱼 35
'''
print(df.replace(to_replace=388,value=38))
'''
菜谱名 价格
0 红烧肉 39
1 铁板鱿鱼 30
2 小炒肉 26
3 干锅鸭掌 38
4 酸菜鱼 35
'''
更改数据类型
df = pd.DataFrame({'A':['5', '6', '7'], 'B':['3', '2', '1']})
# 查看数据的类型
print(df.dtypes)
'''
A object
B object
dtype: object
'''
df = pd.DataFrame({'A': ['5', '6', '7'],
'B': ['3', '2', '1']},dtype='int')
print(df.dtypes)
'''
A int32
B int32
dtype: object
'''
通过astype()方法可以强制转换数据的类型。
astype(dtype,copy = True,errors =‘raise’,** kwargs )
astype()方法存在着一些局限性,只要待转换的数据中存在非数字以外的字符,在使用astype()方法进行类型转换时就会出现错误,而to_numeric()函数的出现正好解决了这个问题。
to_numeric()函数可以将传入的参数转换为数值类型。
pandas.to_numeric(arg, errors=‘raise’, downcast=None)
print(df['B'].astype(dtype='int'))
'''
0 3
1 2
2 1
Name: B, dtype: int32
'''