Task2 数据清洗及特征处理_学习笔记

一、基础知识

1、缺失值的查看和处理

1.2 缺失值的查看

##查看缺失值
#方法一:isnull()  ##isnull()替换成notnull()就是统计非缺失值数
rows_null=dep.isnull().sum(axis=1)#查看每行有多少缺失值
cols_null=dep.isnull().sum(axis=0)#查看每列有多少缺失值(默认axis=0,不写也可)
all_null=dep.isnull().sum().sum() #查看整表有多少缺失值
sp_null=dep[['年龄','客舱']].isnull().sum()#查看特定列的缺失值数

#方法二:count() #先查出非缺失值数
rows_not_null=dep.count(axis=1)#查看每行有非缺失值
cols_not_null=dep.count(axis=0)#查看每列有非缺失值
sp_not_null=dep[['年龄','客舱']].count() #查看特定列多少非缺失值
cols_num=dep.count().count() #查看整表有多少列,等同 dep.shape[1]
rows_num=dep.count(axis=1).count() #查看整表有多少列,等同 dep.shape[0]

#方法三:df.info()直接查看表信息,统计非缺失值
dep.info()
##查看特定列数据
dep[['年龄','客舱','票价']].head(10)

1.3 对缺失值进行处理

空值:在pandas中的空值是:" "
缺失值:pandas里,如果是DataFrame中,缺失值可以表示为nan或者naT(缺失时间)。如果是在Series中,则为none或者nan。

None: 是Python自带的数据类型,被看作一个object对象,不能参与到任何计算中
np.nan: float类型 能参与计算,但结果总是nan
所以,检索空缺值用np.nan要比用None好。

1.3.1 删除(dropna)
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

函数作用:删除含有空值的行或列
函数具体参数:
axis维度,axis=0表示index行,axis=1表示columns列,默认为0
how"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列
thresh axis中至少s有thresh个非缺失值,否则删除。
subset在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
inplace刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。
注意:drop方法中的axis值与其他方法相反,axis=0表示行,=1表示列。

1.3.2 填充(fillna)
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

函数作用:填充缺失值
主要参数:
value 需要用什么值去填充缺失值
axis 确定填充维度,从行开始或是从列开始
method 填充缺失值所用的方法。
limit 确定填充的个数,如果limit=2,则只填充两个缺失值。

# 方法一:dropna()函数

#删除含缺失值的列
a=dep.dropna(axis=1)

#删除任何含有缺失值的列
b=dep.dropna(axis=1,how='any')

#删除少于12个的非缺失值的行
c=dep.dropna(thresh=12)

#删除指定列中的有缺失值的行
d=dep.dropna(subset=['年龄','客舱','登船港口']) 

使用:
method
(1)ffill:用缺失值前面的一个值代替缺失值,如果axis =1,那么就是横向的前面的值替换后面的缺失值,如果axis=0,那么则是上面的值替换下面的缺失值。横向用缺失值前面的值替换缺失值"/“纵向用缺失值上面的值替换缺失值”,
这一种方法,都是用缺失值前面的值对缺失值进行填充。(行/列都可以指定)
(2)backfill/bfill:缺失值后面的一个值代替前面的缺失值(具体用法与前面类似)。
注意~用这种方法时不能与value同时出现。

# 方法二:fillna()函数

#所有缺失值用0填充
e=dep.fillna(0)

#不同列用不同值填充,value为字典格式;limit=1限制只填充1个(若取消该限制,默认都填充)
values={'年龄':0,'客舱':'a'}
f=dep.fillna(value=values,limit=1)

#默认axis=0,表示 列维度上空缺值由上一个填充;如果axis=1,则表示行维度上空缺值由前一个填充
g=dep.fillna(axis=0,method='ffill')

#使用均值mean()来填充:
##法一:指定列填充(此处只有年龄列可以有平均值)
h=dep.fillna(dep.mean()['年龄'])

##法二:列填充(默认只会填充可以有平均值的列)
i=dep.fillna(dep.mean())
h

https://zhuanlan.zhihu.com/p/109366433
https://zhuanlan.zhihu.com/p/109434512

2、重复值的查看和处理

2.1 重复值的查看

DataFrame.duplicated(subset = None,keep =‘first' )返回boolean Series表示重复行

参数
subset:列标签或标签序列,可选
仅考虑用于标识重复项的某些列,默认情况下使用所有列
keep:{‘first’,‘last’,False},默认’first’
first:标记重复,True除了第一次出现。
last:标记重复,True除了最后一次出现。
False:将所有重复项标记为True。

import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
#duplicated()查看重复值
a=dep[dep.duplicated()]

2.2 重复值的去除

DataFrame.drop_duplicates(subset = None,keep ='first',inplace = False

参数
subset : 指定列,默认情况下使用所有列
keep : {‘first’,‘last’,False},默认’first’
first :删除重复项保留第一次出现的。
last :删除重复项保留最后一次出现的。
false:删除所有重复项。
inplace : 布尔值,默认为False

# drop_dujplicates()去除重复值
b=dep.drop_duplicates(['登船港口'])#按指定列去重
b

2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

2.3.1 分箱(离散化)处理

分箱处理:对数据进行分类

import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
dep_new=pd.DataFrame(dep['年龄']) #定义dep_new

dep_new['年龄区间1']=pd.cut(dep['年龄'],bins=[0,30,60,80]) #分区间
dep_new['分类1']=pd.cut(dep['年龄'],bins=[0,30,60,80],labels=['青年','中年','老年']) #指定labels

dep_new['年龄区间2']=pd.cut(dep['年龄'],5) #按照年龄平均分成 5个区间
dep_new['分类2']=pd.cut(dep['年龄'],5,labels=['1','2','3','4','5']) #指定labels

# qcut()
dep_new['年龄区间3']=pd.qcut(dep['年龄'],[0,0.1,0.3,0.5,0.7,0.9,1]) #按照百分比分成 5个区间
dep_new['分类3']=pd.qcut(dep['年龄'],[0,0.1,0.3,0.5,0.7,0.9,1],labels=['1','2','3','4','5','6']) #指定labels

dep_new
2.3.2 文本变量转换

查看

import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
#方法一: value_counts()  对不同对象计数
a=dep['登船港口'].value_counts(ascending=True)
#方法二: unique()  nunique()
b=dep['登船港口'].unique()
c=dep['登船港口'].nunique()
b

unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
nunique() 返回的是唯一值的个数

文本转换

pandas.Series.map:
Series.map(self, arg, na_action=None)
import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
# replace()
dep['Sex']=dep['性别'].replace({'male':1,'female':2}) 
#map()
dep['Sex2']=dep['性别'].map({'male':1,'female':2}) 
dep

------------------------------------我是分割线,下面还不太理解--------------------------

sklearn处理分类特征
preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值

from sklearn.preprocessing import LabelEncoder
for feat in ['客舱', '船票信息']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(dep[feat].unique(), range(dep[feat].nunique())))
    dep[feat + "_labelEncode"] = dep[feat].map(label_dict)
    dep[feat + "_labelEncode"] = lbl.fit_transform(dep[feat].astype(str))

dep.head()

将类别文本转换为one-hot编码

for feat in ['年龄', '登船港口']:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(dep[feat], prefix=feat)
    dep = pd.concat([dep, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)
    
dep.head()```

#### 2.3.3 特征提取

```python
dep['Title'] = dep['乘客姓名'].str.extract('([A-Za-z]+)\.', expand=False)
dep.to_csv('train_clean_final.csv')
dep

二、练习数据的处理

1、处理步骤

1.对缺失值进行处理
用合乎逻辑的数替代缺失值(比如0或者平均数,上一位数等)
2.清除重复值
3.对年龄分箱处理(分为5段)
4.对文本变量进行转换
如将文本变量用数字变量或者one-hot编码
5.从字段中提取特征值
6.数据预处理完毕,保存数据

https://www.cnblogs.com/lavender1221/p/12724186.html#
https://zhuanlan.zhihu.com/p/59252361

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值