pandas数据清洗

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

数据清洗

数据清洗是对一些没有用的数据进行处理的过程。

很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况如果要对使数据分析更加准确就需要对这些没有用的数据进行处理。

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
'''
  1. duplicated(subset=None,keep=‘first’) 方法用于标记是否有重复值
  2. 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π σ1e2σ2(xμ)2

数值几乎全部集中在μ-3σ,μ+3σ)]区间内超出这个范围的可能性仅占不到0.3%。所以凡是误差超过这个区间的就属于异常值应予以剔除

箱型图

箱形图是一种用作显示一组数据分散情况的统计图。在箱形图中异常值通常被定义为小于QL – 1.5QR或大于QU + 1.5IQR的值。

异常值替换

replace()方法不仅可以对单个数据进行替换也可以多个数据执行批量替换操作。

replaceto_replace = Nonevalue = Noneinplace = Falselimit = Noneregex = Falsemethod =‘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()方法可以强制转换数据的类型。

astypedtypecopy = Trueerrors =‘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
'''
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6