第二章 数据清洗及特征处理 2.1 数据清洗及特征处理 2.1.1 缺失值观察与处理动手学数据分析(二)主要对数据进行清洗,其主要任务为数据缺失值观察与处理、数据重复值观察与处理以及文本型数据观察与处理。数据清洗的质量好坏直接影响后续的数据建模,数据分析的结果,故该步骤很重要,不能忽视。
任务一:缺失值观察
方法1:观察整体数据信息
#观察数据信息 df.info()
方法2:查看数据缺失值个数
#查看数据缺失值个数 df.isnull().sum() #查看特定特征缺失值个数 df['Cabin'].isnull().sum()
方法3:查看特定列数据
#方法一:直接使用列标签 df[['Age','Cabin','Embarked']] #方法二:使用loc函数 df.loc[:,['Age','Cabin','Embarked']] #方法三:使用iloc函数 df.iloc[:,[5,10,11]]
任务二:缺失值处理
检查缺失值有三种方法。
#检查空缺值1 np.nan df[df["Age"]==np.nan]=0 #检查空缺值2 None df[df["Age"]==None]=0 #检查空缺值3 isnull() df[df["Age"].isnull()]=0
【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
np.nan更好,因为pandas空缺值默认为NAN;None有时可能无法找到缺失值,因为None只能应用于数据类型为object,而对于数值型数据,可能查找不到。
处理缺失值一般有两种方法。
方法1:fillna 缺失值填充
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
参数说明:
value:用于填充的空值的值。
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法。pad / ffill,表示用前面行/列的值,填充当前行/列的空值,//backfill / bfill,表示用后面行/列的值,填充当前行/列的空值。
axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
inplace:默认False不更改原数据;True表示直接在原数据上更改;。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
方法2:dropna 缺失值丢弃
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:
axis: default 0指行,1为列
how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行/列;'all’指清除全是缺失值的
thresh: int,保留含有int个非空值的行
subset: 对特定的列进行缺失值删除处理
inplace: 这个很常见,True表示直接在原数据上更改
#尝试对Age列的数据的缺失值进行处理 df['Age'].fillna(1) df['Age'].dropna(how='any') #尝试直接对整张表的缺失值进行处理 df.dropna(axis=0,how='any',inplace=True)2.1.2 重复值观察与处理
任务一:重复值观察
使用duplicated()函数查看重复值。
duplicated(subset=None, keep=‘first’)
参数说明:
subset:默认为None,需要标记重复的标签或标签序列
keep:默认为‘first’,如何标记重复标签first:将除第一次出现以外的重复数据标记为True
last:将除最后一次出现以外的重复数据标记为True
False:将所有重复的项都标记为True(不管是不是第一次出现)
#查看数据中的重复值 df[df.duplicated()]
任务二:重复值处理
使用drop_duplicates()直接把重复值给删掉.
drop_duplicates(subset=None, keep=‘first’, inplace=False)
参数说明:
subset:与duplicated()中相同
keep:与duplicated()中相同
inplace:与pandas其他函数的inplace相同,选择是修改现有数据还是返回新的数据
#处理我们数据的重复值 df.drop_duplicates() df2.1.3 数据特征观察与处理
任务一:连续型数据离散化
【分箱操作】就是将连续数据转换为分类数据的过程。分箱操作分为等距分箱和等频分箱。
等距分箱有三种分箱方法。
方法1:between&loc
#将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示 df.loc[df['Age'].between(0,5,'left'),'age_grade']=1 df.loc[df['Age'].between(5,15,'left'),'age_grade']=2 df.loc[df['Age'].between(15,30,'left'),'age_grade']=3 df.loc[df['Age'].between(30,50,'left'),'age_grade']=4 df.loc[df['Age'].between(50,80,'left'),'age_grade']=5 df.age_grade.value_counts()
方法2:cut
#将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示 df['age_grade']=pd.cut(x=df['Age'],bins=[0,5,15,30,50,80],labels=[1,2,3,4,5],include_lowest=True) df.age_grade.value_counts()
方法3:values_counts。通常用于计算系列中唯一值的数量;同时作为根据最高和最低数值将分数范围分成n个相等的部分的函数(默认),也可以通过传入边界列表来定义 bin 边界。
#根据最高和最低数值将分数范围分成5个相等的部分 df['age_grade']=df['Age'].value_counts(bins=5,sort=False) ##将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示 df['age_grade']=df['Age'].value_counts(bins=[0,5,15,30,50,80],sort=False) #计算系列中唯一值的数量 df.age_grade.value_counts()
等频分箱方法为qcut()函数将变量离散为大小相等的部分
#根据数据数量将其等分为5部分 df['age_grade'],cut_bin=pd.qcut(df['Age'],q=5,labels=[1,2,3,4,5],retbins=True) #retbins:是否返回bin边界
任务二:文本型数据转换
1、查看文本变量名及种类
#方法1:values_counts() df['Sex'].value_counts() #方法2:unique() #df['Sex'].unique()
2、将文本变量Sex, Cabin ,Embarked用数值变量12345表示
将文本数据转换为数值型变量一共有两种数据转换方式。分别为map()映射函数和replace()替换函数。
方法1:map()映射函数
#方法1、通过数据字典映射
df['re_embarked']=df['Embarked'].map({'C':1,'S':2,'Q':3})
df.head()
#方法2、通用函数映射
def re_embarked(x):
if x=='C':
embarked_class=1
elif x=='S':
embarked_class=2
else:
embarked_class=3
return embarked_class
df['re_embarked']=df['Embarked'].map(re_embarked)
df.head()
方法2:replace()替换函数
将文本变量Sex用数值变量12表示 df['re_sex']=df['Sex'].replace(['male','female'],[1,2]) df
3、将文本变量Sex, Cabin, Embarked用one-hot编码表示
pandas使用pd.get_dummies 进行one-hot编码
#将文本变量Sex用one-hot编码表示 new_sex=pd.get_dummies(df['Sex']) new_sex
4、从文本变量中提取特征
文本提取使用str.extract()方法
#从文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title']=df['Name'].str.extract('([A-Za-z]+).', expand=False)
df.head()
【总结】 动手学数据分析(二)是根据先前得到的数据进行数据清洗,主要有数据缺失值处理、数据重复值处理及数据转换。通过本节学习,加强了对缺失值函数、重复值函数和数据转换函数的使用,同时也培养了对于不熟悉的函数用法立马去搜索学习,现学现用。(PS:这次完全就是ddl的最后期限,有点赶,好多细节没写好)



