欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 数据清洗

程序员文章站 2022-03-20 18:04:17
...


基于第三方库Numpy及Pandas 进行数据清洗

1. 查看数据

查看数据
数据抽样
整体概况
字段解读
数据形状
判断数据规模

1.1. 数据抽样

  • 查看前n条数据 : data.head(n) 默认前5条
  • 查看后n条数据: data.tail(n) 默认后5条
  • 随机抽样: data.sample(n) 默认抽取1条

1.2. 数据形状

data.shape 元组类型

  • 显示: (行数, 列数)
  • 注意: shape是属性, 不加’()’

1.3. 数据整体情况

data.info()

  • 内部显示整体长度及每一列的非空长度和数据类型
  • 注意: info()函数没有返回值, 只有输出, 所以只能看到而不能获取到

2. 缺失值处理

按行删除
按列删除
固定值
众数
均值
上下值填充
中位数
其它固定值
缺失值处理
统计缺失值
删除
填补
上值
下值

2.1. 统计缺失值

判断缺失

data.isnull()

  • 将所有的元素转换为Bool值, 如果是缺失则为True, 返回一个DataFrame
  • 同样, data.notnull()方法, 与isnull()相反, 用于统计非空元素

统计缺失

data.isnull().sum()

  • 对每一列进行求和, 由于True值为1, 所以求和即为缺失值计数
  • 返回一个Serices, 索引为列名, 内容为缺失值个数
  • data.isnull().sum().sum() 二次进行求和可得到整个数据的缺失值个数

2.2. 删除缺失值

删除方法

data.dropna()方法

data.dropna()
'''
	参数:
		axis=0: int {0, 1} 默认0
			0: 按行删除
			1: 按列删除
		how='any': str{'any', 'all'} 默认any
			'any': 包含空值即删除
			'all': 全为空值才删除
		thresh=None: int, 最少有多少个非空值才不会被删除
		subset=None: array-like, 按照其它轴考虑
			例: 如果删除行, 选择按照哪些列去作为判断标准(其它列即使为空也不管)
		replace=False: bool 默认False, 是否原地修改 
'''

当设置thresh后, how的作用就被剥夺

按行删除

按行删除空值, 需要考虑的是此行中其它列的非空数据的重要性, 同时需要考虑缺失值的重要性

import pandas as pd

data = pd.read_csv('./train.csv')
# 删除非空值少于80%的行, 原地修改
data.dropna(axis=0, thresh=int(data.shape[0] * 0.8), inplace=True)

按列删除

按列删除空值, 需要考虑此列非空元素的重要性, 以及空值的重要程度

import pandas as pd

data = pd.read_csv('./train.csv')
# 删除存在空值的列, 原地修改
data.dropna(axis=1, how='any', inplace=True)

2.3. 填补缺失值

填补方法

data.fillna()

data.fillna()
'''
	参数:
		value=None: scalar, dict, Serices, DataFrame 固定值填充
		method=None: str {'pad', 'ffill', 'backfill', 'bfill'}
			pad/ffill: 按轴使用空值位置的上一个非空值填充
			backfill/bfill: 按轴使用空值位置的下一个非空值填充
		axis=None: int {0, 1} 轴
		inplace=False: bool 是否原地修改
		limit=None: int 与method参数配合使用, 设置向上/向下搜索的最大范围, 默认范围为整个轴
		downcast=None: dict 类型降级(不常用)
'''

固定值填补

使用固定值填补首选统计量: 均值、中位数、众数, 0

  • 均值: data[‘a’].mean()
  • 中位数: data[‘a’].median()
  • 众数: data[‘a’].mode()[0]
  • 注意: 由于众数可能重复, 所以mode方法返回的是一个Serices
import pandas as pd

data = pd.read_csv('./train.csv')
# a列使用均值, b列使用中位数, c列使用第一个众数, d列使用0值填充
data.fillna(value={'a':data['a'].mean(), 'b':data['b'].median(), 'c':data['c'].mode()[0], 'd':0}, inplace=True)

上下值填补

上下值填补一般用于分组类的数据
例如: 城市列, [‘上海’, 上海’,上海’,上海’,‘NAN’,上海’], 这种类型的数据, 使用上下值填补, 将会得到真实值

import pandas as pd

data = pd.read_csv('./train.csv')
# 向上填补, 最大范围10, 原地修改
data.fillna(method='ffill', limit=10, inplace=True)

3. 重复值处理

重复数据直接删除是最常规的做法

3.1. 查看重复值

data.duplicated()

data.duplicated()
'''
	参数:
		subset: 子集, 只选择某些列来作为识别重复
		keep='first': {'first', 'last', False}
			'first': 重复数据中第一条不认为是重复数据, 值为False, 剩余为True,表示重复
			'last': 重复数据中最后一条不认为是重复数据, 值为Faslse
			False: 不保留重复数据, 全部为True
'''

3.2. 删除重复值

data.drop_duplicates()

data.drop_duplicates()
'''
	参数:
		subset: 子集, 只选择某些列来作为识别重复
		keep='first': {'first', 'last', False}
			'first': 重复数据中保留第一条, 剩余删除
			'last': 重复数据中保留最后一条, 剩余删除
			False: 不保留重复数据, 全部删除
		inplace=False: bool, 是否原地修改
'''

4. 数据类型处理

格式正确
数据类型处理
字符串替换
转换数据类型

修改数据类型

data[‘a’].astype()

data['a'].astype()
'''
	参数:
		dtype: 数据类型, 
'''

格式正确

import pandas as pd

data = pd.read_csv('./train.csv')
# 将日期列修改为datetime64类型
data['Date'].astype(np.datetime64)
# 将价格列修改为float64类型
data['price'].astype('float64')
data['price'].astype(np.float64)