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)