数据清洗及特征处理
通常原数据都是不干净的,可能存在异常值,缺失值以及其他问题。所以一般进行数据分析之前都需要先对数据进行清洗。
读个文件先
#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
df = pd.read_csv('train.csv')
缺失值观察与处理
缺失值,可能是人为失误或者机器失误造成部分数据值的空缺,如果不对这些空缺的地方进行操作,极大可能会影响我们后续分析或建模得到的结果。
首先是观察缺失值,观察缺失值的方法可以直接通过info()
来查看,info()
可以观察到行数、各列列名、每列非缺失值数、数据类型以及数据总量
df.info()
#运行结果
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
可以看到总共891行,但是Age、Cabin和Embarked的非缺失值数都没有达到891,说明其中都含有缺失值,但是这样子看不够直观,而且不能快速的看出各列一共有多少给缺失值,通过isnull()
和sum()
组合可以查看每列的缺失值个数。
df.isnull()
df.isnull().sum()
#运行结果
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
如果再组合一个sum()
就可以直接得出缺失值的总和
df.isnull().sum().sum()
#运行结果
866
isnull()
是元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者为Nan就显示True,否则就是False。pandas中会将NaN和None都处理为np.nan
。
None
None
为python自带的,为None Type
类型,代表空类型,并不能参与运算
df[df['Age']==None]
#结果显示为空,未检测到有空值
np.nan
numpy中的isnan对应的是NaN值,代表“不是数字”,数值类型为float,数组中显示为nan,能参与运算,但结果显示为NaN。
df[df['Age']==np.nan]
#结果显示依旧为空,这里并不是真的不存在空值!
注意:这里卡了我好久,后来在论坛上找了下,找到了原因。计算机中本没有绝对相等的数据,所谓的相等只是精度允许的条件下相等!np.nan原意为not a number,所以,对于某值是否为nan进行判断,只能使用np.isnan(i),绝不能用i == np.nan来判断,因为nan具有不等于自身的属性!
参考资料:https://blog.csdn.net/craftsman2020/article/details/107739405
isnull()
这里顺带一提,numpy用isnan()
检查是否存在NaN,pandas用isna()
或者isnull()
检查是否存在NaN。pandas它是构建在numpy之上的,在numpy中,即没有na
也没有null
,而只有NaN
(“Not A Number”),因此,pandas也沿用NaN值,所以造成了isna和isnull两个名称不同但功能相同的情况。
在不同的应用场景中,对缺失值的处理都不一样,大致可分为:
- 删除元组
- 数据补齐
- 不处理
删除元组就算将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表,以减少历史数据来换取信息的完备,但可能会对数据资源造成一定的浪费,若在数据集不大且缺失值较多的情况下,该方法可能并不适用。
数据补齐是最常用的缺失值处理方式,补齐的方法也比较多,例如:人工填写、特殊值填充、平均值填充、K最近距离邻法等等,使用这些方法需要对数据有一定的了解,寻找最合适的填充方式。
不处理缺失值我认为在某些人工神经网络中,尚不确定缺失值对模型训练结果有何影响,可以考虑不处理缺失值来进行观测。
参考资料:https://blog.csdn.net/zrjdds/article/details/50223091
删除元组
删除元组的操作通常都采用dropna()
,此操作会将缺失值所在行一并删除
#原数据
df.head(5)
#删除缺失值
df.dropna().head(5)
通过观察乘客ID可以发现,部分乘客数据已经消失了。
数据补齐
在上述中,我们已经可以正确判断缺失值元组,如果再进行简单的数据填充就很方便了
直接对空缺的位置进行赋值,我这里用0去填充
df[df['Age'].isnull()] = 0
df.head