目录
1 数据清洗
- 数据清洗:我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗
1.1 缺失值观察与处理
1.1.1 缺失值观察
- 查看数据信息:
df.info()
df.info()
- 查看缺失值个数:
df.isnull().sum()
df.isnull().sum()
- 查看指定列的数据
df[['Age','Cabin','Embarked']].head()
1.1.2 缺失值处理
-
处理缺失值的几种思路:
- 1 删除缺失值样本
- 2 可能值插补缺失值
-
对缺失值的判断处理
- 1判断是否为
None
df[df['Age']==None]=0 df.head(3)
- 2判断是否为
np.nan
df[df['Age'] == np.nan] = 0 df.head(3)
注意:检索空缺值用
np.nan
要比用None
好,因为数值列读取数据后,空缺值的数据类型为float64
所以用None
一般索引不到,比较的时候最好用np.nan
- 3
.isnull()
df[df['Age'].isnull()] = 0 df.head(3)
- 1判断是否为
-
删除缺失值函数:
dropna()
- 格式:
DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)
- 参数:
- axis:默认为0,0按行删除,1按列删除
- how:any是指有缺失值的所有行/列,all是指一整行/列都是缺失值的行/列
- inplace:默认是False,即筛选后的数据存为副本,True是直接在原数据上修改
df.dropna().head(3)
- 格式:
-
填充缺失值函数:
fillna()
注:如果列是lnt类型就0;如果是str就用nan
# 用0填充缺失值 df.fillna(0).head(3)
1.2 重复值观察与处理
1.2.1 重复值观察
- 观察重复值函数:
duplicated()
- 作用:查找并显示数据表中的重复值
注意:
1 当亮条记录中所有的数据都相等时,duplicated()
才会判断为重复值
2duplicated()
支持从前向后(first
)【默认】,和从后向前(last
)两种查找模式
3 默认是first
模式,也就是后面的条目在重复值判断中显示为True
-
用法:
- 1 查询重复值的位置
DataFrame.duplicated()
# 查看Age列的重复值位置 df['Age'].duplicated()
- 2 检查有多少重复值
DataFrame.duplicated().sum()
df.duplicated().sum() # 176
- 3 打印重复值
DataFrame[DataFrame.duplicated()]
df[df.duplicated()]
- 1 查询重复值的位置
1.2.2 重复值处理
-
清除重复值函数:
drop_duplicates()
- 格式:
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
- 参数:
- subset: 列名,默认所有的列
- keep: 是否保留{‘first’, ‘last’, False}。
- 【默认】keep= ‘first’ 表示去重时每组重复数据保留第一条数据,其余数据丢弃;
- keep=‘last’ 表示去重时每组重复数据保留最后一条数据,其余数据丢弃;
- keep=False 表示去重时每组重复数据全部丢弃,不保留
- inplace: 是否替换{False, True},【默认】inplace=False表示去重之后不覆盖原表格数据,inplace=True表示去重之后原表格数据被覆盖
# 对整行有重复值的清除 df.drop_duplicates().head()
- 格式:
2 特征处理
2.1 特征分类
- 特征大概分为两类:
- 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
- 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
- 建模需要的特征:
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
2.2 分箱(离散化)操作
- 分箱解释:
- 什么是分箱:
简单点说就是将不同的东西,按照特定的条件放到一个指定容器里
比如水果,把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据,颜色就是条件
- 什么数据要分箱:
数据主要分为连续变量和分类变量,分箱的操作主要针对于连续变量。 - 分箱操作的作用:
在建模中,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险
- 什么是分箱:
- 分箱类别:
分箱分为有监督和无监督- 有监督:就是个人确定范围区间
- 方法:python 中主要使用
cut
方法
- 方法:python 中主要使用
- 无监督:让代码自己划分组
- 方法:使用的是
qcut
方法
- 方法:使用的是
- 有监督:就是个人确定范围区间
cut()
函数- 格式:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
- 常用参数:
x
:类array对象,且必须为一维,待切割的原形式bins
: 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量。如果bin是序列,它定义了允许非均匀in宽度的bin边缘right
:布尔值。是否是左开右闭区间labels
:用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元
# 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示 df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5']) df.head()
#将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示 df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5']) df.head(3)
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示 df['AgeBand'] = pd.cut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5']) df.head()
- 格式:
2.3 对文本变量进行转换
-
查看文本变量名及种类
- 方法一:
value_counts
df['Sex'].value_counts()
- 方法二:
unique
df['Sex'].unique() ''' array(['male', 'female', 0], dtype=object) '''
df['Sex'].nunique() # 2
- 方法一:
-
文本转换
- 将类别文本转换为12345
- 方法一:
replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2]) df.head()
- 方法二:
map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2}) df.head()
- 方法三:使用
sklearn.preprocessing
的LabelEncoder
from sklearn.preprocessing import LabelEncoder for feat in ['Cabin', 'Ticket']: lbl = LabelEncoder() label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique()))) df[feat + "_labelEncode"] = df[feat].map(label_dict) df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str)) df.head()
- 将类别文本转换为one-hot编码
- 方法一:
OneHotEncoder
for feat in ["Age", "Embarked"]: # x = pd.get_dummies(df["Age"] // 6) # x = pd.get_dummies(pd.cut(df['Age'],5)) x = pd.get_dummies(df[feat], prefix=feat) df = pd.concat([df, x], axis=1) #df[feat] = pd.get_dummies(df[feat], prefix=feat) df.head()