一、数据清洗
1. 缺失值
1.1 查看缺失值
方法一:df.info()
查看每列的详细信息
方法二:df.isnull().sum()
查看每列有效值个数
1.2 处理缺失值
具体问题具体分析,看缺失的数据是哪种类型的,再进行赋值处理。
常见的判断空值方法有:np.nan
, None
, .isnull()
例如数字类型,就可以将NAN赋值为0:
df[df['Age'] == None] = 0
df[df['Age'].isnull()] = 0
df[df['Age'] == np.nan] = 0
数值列读取的空数据,其类型为 float64,None 一般索引不到,此时使用
np.nan
较好。
另外的方法:.dropna()
, .fillna()
# dropna() 方法
#
# axis:指定删除数据缺失为行或列;0为行,1为列,默认为0
# how:{‘any’, ‘all’}, default ‘any’;any 存在缺失数据就删除该行/列,all 全部为缺失数据才删除
# thresh:这一行除去NA值,剩余数值的数量大于等于thresh,就显示这一行
# subset:筛选
# inplace:是否在原对象基础上进行修改,当inplace=True时,函数返回值为None,否则返回DataFrame
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# fillna() 方法
#
# value:填充空数据的值;scalar, dict, Series, or DataFrame
# method:用于填充空数据的方法(向前,向后);{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None
# axis:{0 or ‘index’, 1 or ‘columns’}
# inplace:是否在原对象基础上进行修改,当inplace=True时,函数返回值为None,否则返回DataFrame
# limit:向前或向后填充空数据的最大数目
# downcast:向下转换为适当的数据类型,如float64 到 int64
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
例如:
df.dropna()
直接删除nan行数据1df.fillna(0)
仅填充nan数据为指定数字
2. 重复值
2.1 查看重复值
查看重复值,使用 DataFrame.duplicated()
方法:
2.2 清理重复值
清理整行的重复值:DataFrame.drop_duplicates()
方法
清理完成后保存为csv格式:df.to_csv('test_clear.csv')
二、特征处理
首先观察数据的特征,可分为两大类:
1. 分箱(离散化)处理
分箱操作,顾名思义,就是对数据进行分装、拆分,即对其离散化处理。建模时对特征进行离散化处理,可增强模型的稳定性,同时也能降低过拟合出现的几率2。
对年龄进行分箱操作
2. 转换文本类型变量
观察文本变量种类:
-
方法一:计数 .value_counts()
-
方法二:.unique()
- .nunique() 统计不同类型个数
然后转换文本(本质是文本的替换):
2.1 Sex, Cabin, Embarked用 数值变量 表示的方法:
①:replace
②:map
③:sklearn.preprocessing 的 LabelEncoder
2.2 Sex, Cabin, Embarked用 one-hot 编码5 表示的方法:
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,是分类变量作为二进制向量的表示,因此首先要求 将分类值映射到整数值。
这里使用 OneHotEncoder
3. 提取Name中的Titles特征(Mr, Miss, Mrs等头衔)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
提取出来的头衔可以进一步作为输入进行数据分析。