栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Datawhale分组学习—动手学数据分析(二)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Datawhale分组学习—动手学数据分析(二)

动手学数据分析(二)主要对数据进行清洗,其主要任务为数据缺失值观察与处理、数据重复值观察与处理以及文本型数据观察与处理。数据清洗的质量好坏直接影响后续的数据建模,数据分析的结果,故该步骤很重要,不能忽视。

第二章 数据清洗及特征处理 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()
df
2.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的最后期限,有点赶,好多细节没写好)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976796.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号