2.1缺失值观察与处理
2.1.1 任务一:缺失值观察
pandas里边查找NaN值的话,可以是.isna(),也可以是.isnull()
- isna的意思是判断是不是 not a number,主要是数值字段;
- isnull的意思是判断是否为空值
- 1)
df.isna().sum() 查看空值信息
df.isnull().sum() 查看空值信息
df.info() 查看数据信息 - 2)
df[['Age','Cabin','Embarked']]
pd.DataFrame(df,columns=['Age','Cabin','Embarked'])
df.loc[:,['Age','Cabin','Embarked']]
df.iloc[:,[5,10,11]] - loc只能通过index和columns来取,不能用数字; iloc只能用数字索引,不能用索引名
2.1.2 任务二:对缺失值进行处理
- 处理缺失值的思路一般是用dropna函数与fillna函数
- 请尝试对Age列的数据的缺失值进行处理
- age_nan=df[df['Age'].isnull()].index
df.loc[age_nan,'Age']=0
df
处理age列的缺失值赋值为0 - df[df['Age'].isnull()]=0
df[df['Age'] == np.nan] = 0
df[df['Age']==None]=0
处理age列的缺失值整行赋值为0
- 直接对整张表的缺失值进行处理
df.dropna() 默认axis=0,表示删除包含缺失值的行
axis=0 行,axis=1列
how{‘any’, ‘all’},默认‘any’; 当我们至少有一个 NA 或所有 NA 时,确定是否从 DataFrame 中删除了行或列。
‘any’:如果存在任何 NA 值,则删除该行或列。
‘all’:如果所有值都是 NA,则删除该行或列。
thresh: axis中至少有thresh个非缺失值,否则删除。
subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除
inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。默认是False,即创建新的对象进行修改;如果是true,执行操作并返回 None。
指定删除某个分组(可以理解成哪几列或那几个标签)中的含有缺失值的行或列 df.dropna(subset=['Pclass','Parch','Embarked'])-
df.fillna(0) 用数字0填充缺失值
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs) 表示填充缺失值
value: 需要用什么值去填充缺失值
axis: 确定填充维度,从行开始或是从列开始
method: 填充缺失值所用的方法。''ffill' 'backfill/bfil'
limit: 确定填充的个数,如果limit=2,则只填充两个缺失值。 ffill:用缺失值前面的一个值代替缺失值
-
backfill/bfill:缺失值后面的一个值代替前面的缺失值
参考:
https://zhuanlan.zhihu.com/p/109366433
https://zhuanlan.zhihu.com/p/109434512
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
2.2 重复值观察与处理
2.2.1 任务一:请查看数据中的重复值
df[df.duplicated()]
2.2.2 任务二:对重复值进行处理
(1) 重复值有哪些处理方式呢?
- drop_duplicates函数用于删除Series、DataFrame中重复记录,并返回删除重复后的结果
(2) 处理我们数据的重复值 - df.drop_duplicates()
2.2.3 任务三:将前面清洗的数据保存为csv格式
df.to_csv('./titanic/train_clear.csv')
2.3 特征观察与处理
2.3.1 任务一:对年龄进行分箱(离散化)处理
- 数据分箱是一种将多个连续值分组为较少数量的“分箱”的方法,分箱的数据不一定必须是数字,可以是文字,也可以是像素;一般在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险;
对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开
- df['age_bin_1'] = pd.qcut(df['age'],3) #新增一列存储等频划分的分箱特征(每个区间的样本个数都是一样)
df['age_bin_2'] = pd.cut(df['age'],3) #新增一列存储等距划分的分箱特征
将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
- df['Age_bin_1'] = pd.cut(df['Age'],5,labels=['1','2','3','4','5'])
将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
- df['Age_bin_2'] = pd.cut(df['Age'],[0,5,15,30,50,80],right = False, include_lowest = True,labels=['1','2','3','4','5'])
将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
- df['Age_bin_3'] = pd.cut(df['Age'], [0.0,0.1,0.3,0.5,0.7,0.9], labels=['1','2','3','4','5'])
2.3.2 任务二:对文本变量进行转换
(1) 查看文本变量名及种类
- value_counts()
-
unique()
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
- LabelEncoder是对不连续的数值或文本进行编码。
fit(y) :fit可看做一本空字典,y可看作要塞到字典中的词。
fit_transform(y):相当于先进行fit再进行transform,即把y塞到字典中去以后再进行transform得到索引值。
inverse_transform(y):根据索引值y获得原始数据。
transform(y) :将y转变成索引值。
(版权声明:此处为CSDN博主「桂小林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/quintind/article/details/79850455)
参考:
https://blog.csdn.net/quintind/article/details/79850455
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。除了整数的索引之外,它都是零值,它被标记为1。
one-hot编码表示分类结果,表示1,那就是[1, 0, 0, 0, 0],表示4,那就是[0, 0, 0, 1, 0]
参考:
https://zj-image-processing.readthedocs.io/zh_CN/latest/pytorch/one-hot%E7%BC%96%E7%A0%81/
2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
- 采用str.extract()函数可用正则从字符数据中抽取匹配的数据
- [A-Za-z]代表任一字母(大写或小写)
- 代表+号前的字符出现1次或多次
([A-Za-z]+). 是匹配 一个或多个字母并且以.结尾的所有字符串组合
- pat:具有捕获组的正则表达式模式。
flags:int,默认值为0(无标志)
expand:如果为True,则返回每个捕获组只有一列的DataFrame
参考:https://www.cda.cn/discuss/post/details/5e848409e7f3136e853521bc
https://vimsky.com/examples/usage/python-pandas-series-str-extract.html