前言: 前面两章介绍了pandas的基本格式、以及简单的数据读取。在本节之中主要介绍一下pandas中如何进行数据清洗的。和之前一样仅仅是介绍一下pandas中基本的数据清洗的方法。如果想要真正的精通pandas的话,肯定是要一个具体的比赛。okay开始本节的学习吧。
本节主要介绍的内容有: 如何处理缺失数据
1、直接删除缺失数据
使用dropna()删除数据记录中含有np.nan的数据时,注意以下三点
1、如果要使用how='all',默认是检查行中的数据是否全部为缺失数据,如果要检查是否所有的列都是缺失数据。则需要指定轴为列元素 axis=1
2、dropna()默认是不修改原始数据的,如果想直接修改原始数据,则需要使用inplace=True
import pandas as pd
import numpy as np
# 生成一个简单的DataFrame数据
data = {'name': ['YYLin', 'YYLin_1', 'YYLin_2', 'YYLin_3', np.nan],
'birth_day': ['2000-01', '2001-02', '2005-03', '2001-04', np.nan],
'age': [6, 7, np.nan, 9, np.nan],
'all_na': [np.nan, np.nan, np.nan, np.nan, np.nan]}
nan_data = pd.DataFrame(data)
print("显示原始数据集中的数据:\n", nan_data)
# 直接删除原始数据中为空的数据
just_drop = False
if just_drop:
dropna_data = nan_data.dropna()
print("删除NA后的原始数据:\n", dropna_data)
else:
nan_data.dropna(how='all', axis=1, inplace=True)
print("删除NA后的原始数据:\n", nan_data)
2、使用固定常数进行填充空值 这个数据清洗的时候,不常用,所以主要介绍一下对于不同的列填充不同的值
注意两点,使用填充之后的数据并不修改原始数据集,如果想要使用原始数据集的话,注意将 inplace=True
fill_data_inplace = False
if fill_data_inplace:
nan_data.fillna({'age': 8, 'birth_day': '1987-07'}, inplace=True)
print("使用固定常数进行填充之后的数据:\n", nan_data)
else:
fill_data = nan_data.fillna({'age': 8, 'birth_day': '1987-07'})
print("使用固定常数进行填充之后的数据:\n", fill_data)
3、使用均值进行填充 相对于使用固定常数进行填充, 使用均值进行填充的方式就较为高级一点,它的实现方式是如果某列出现缺失值,则使用这列的均值填充缺失值,均值填充的时候应该注意的几点。
第一: 使用均值填充的数据只能是数值型数据 例如上例中的age 但是对于str的数据是不能填充的,
第二: 对于str类型的数据不能直接映射到一个整数,然后再填充均值,例如{男 女} 映射到{1 2}, 最后填充的结果1.5,我们不知道这个1.5表示什么。
第三: 对于str类型的数据,可以使用众数进行填充。
第四: 同上,填充之后不修改原始数据 如果想修改的话,要使用
fill_data_inplace = True
# 使用均值进行填充
if fill_data_inplace:
nan_data.fillna(nan_data.mean(), inplace=True)
print("使用均值进行填充之后的结果是:\n", nan_data)
else:
mean_fillna = nan_data.fillna(nan_data.mean())
print("使用均值进行填充之后的结果是:\n", mean_fillna)
4、使用同一类别的数据的均值进行填充,这种方式相对于直接使用均值进行填充的方法,会根据原始数据不同类别的数据进行填充,但是涉及到groupby()函数,就放到后面吧。先介绍一下原理,
1、首先使用groupby() 或者分桶的方式对数据进行分类,
2、如果有缺失值的话,直接使用某个类别中的数据的均值进行填充