首页 > 其他分享 >动手学数据结构 -- Task02_1

动手学数据结构 -- Task02_1

时间:2023-01-20 00:11:06浏览次数:65  
标签:数据结构 -- pandas Age 缺失 df pd Task02 csv

【回顾&引言】前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察。那么在这里,我们主要是做数据分析的流程性学习,主要是包括了数据清洗以及数据的特征处理,数据重构以及数据可视化。这些内容是为数据分析最后的建模和模型评价做一个铺垫。

开始之前,导入numpy、pandas包和数据

#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
df = pd.read_csv('train.csv')
df

2 第二章:数据清洗及特征处理

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。

2.1 缺失值观察与处理

我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢

2.1.1 任务一:缺失值观察

(1) 请查看每个特征缺失值个数
(2) 请查看Age, Cabin, Embarked列的数据
以上方式都有多种方式,所以大家多多益善

#写入代码
ageNa = df['Age'].isna().sum()
cabinNa = df['Age'].isna().sum()
embarkedNa = df['Embarked'].isna().sum()
print(ageNa, cabinNa, embarkedNa)
#写入代码
ageNa = df['Age'].isnull().sum()
cabinNa = df['Age'].isnull().sum()
embarkedNa = df['Embarked'].isnull().sum()
print(ageNa, cabinNa, embarkedNa)
#写入代码
df.info()

df[['Age','Cabin','Embarked']].head(3)

2.1.2 任务二:对缺失值进行处理

(1)处理缺失值一般有几种思路
去掉含有缺失值的样本(行)
将含有缺失值的列(特征向量)去掉
将缺失值用某些值填充(0,平均值、中值等)
(2) 请尝试对Age列的数据的缺失值进行处理

(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

处理缺失值的一般思路:

提醒:可使用的函数有--->dropna函数与fillna函数

# 去除含有缺失值的样本
df1 = df.dropna()
df1
# 对Age列的数据的缺失值进行处理
df2 = df.dropna(subset=['Age'])
df2

df[df['Age']==None]=0
df

df[df['Age'].isnull()] = 0
df

df[df['Age'] == np.nan] = 0
df.head()
#写入代码
# 将含有缺失值的列去掉
df3 = df.dropna(axis=1)
df3
#写入代码
# dropna()函数的作用是去除读入的数据中含有NaN的行
df.dropna().head(3)
# 参数
# axis:default 0指行,1为列
# how:  default any指带缺失值的所有行或列, all指只有改行或该列全为NaN的才会被删除
# thresh: int,保留含有int个非空值的行或列
# subset: 对特定的列进行缺失值的删除处理
# inplace: default False指不替换源文件, True指替换源文件
#写入代码
# fillna()函数的作用是指定一个数值来替代数据中所有的控制NaN
df.fillna(0).head(3)
# fillna(value=None, *, method=None, axis=None, inplace=False, limit=None, downcast=None)
# 参数axis、inplace与dropna一致
# method: 作用是填充。如果为ffill:则是将这个空值的前一个数据复制给这个空值,如果为bfill,则是将这个空值后的一个数据复制给这个空值
# limit: 限制填充的空值的个数,比如某一列有两个空值,如果这里设置为1,则将有一个空值不去管它

【思考1】dropna和fillna有哪些参数,分别如何使用呢?
【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?

思考回答

Pandas中的空值有三个:np.nan、None、pd.NaT(时间格式的空值),这三个值可以用Pandas中的函数isnull()、notnull()、isna()进行判断。

在Python解释器看来,np.nan的类型是float,None的类型是NoneType,所以如果数据列为float的数值列,若用==None去检索将检索不到,从而无法找到缺失值。

因此用isnull()更好,这个函数可以np.nan和None一起检索到。

【参考】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 = pd.read_csv('train.csv')
df[df.duplicated()]

2.2.2 任务二:对重复值进行处理

(1)重复值有哪些处理方式呢?
pandas提供了两个函数专门用来处理数据中的重复值,分别为duplicated()和drop_duplicates()方法
duplicated()用于标记是否有重复值
和drop_duplicates()用于删除重复值
(2)处理我们数据的重复值

方法多多益善

#重复值有哪些处理方式:
df = df.drop_duplicates()
df
#写入代码
df[df.duplicated()]
df

2.2.3 任务三:将前面清洗的数据保存为csv格式

#写入代码
df.to_csv('clear_data_self.csv')

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 任务一:对年龄进行分箱(离散化)处理

(1) 分箱操作是什么?

(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

(5) 将上面的获得的数据分别进行保存,保存为csv格式

#分箱操作是什么:
# 分箱是一种常见的数据预处理技术,有时也被成为分桶或离散化,他可用于将连续数据的间隔分组到“箱”或“桶”中。
df = pd.read_csv("train.csv")
df[df['Age'].isnull()] = 0
# 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5, labels = [1,2,3,4,5])
df
#写入代码
# 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
df.loc[df['Age'].between(0, 5, 'left'), 'AgeBand'] = 1
df.loc[df['Age'].between(5, 15, 'left'), 'AgeBand'] = 2
df.loc[df['Age'].between(15, 30, 'left'), 'AgeBand'] = 3
df.loc[df['Age'].between(30, 50, 'left'), 'AgeBand'] = 4
df.loc[df['Age'].between(50, 80, 'left'), 'AgeBand'] = 5
df

df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df
#写入代码
# 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
df = pd.read_csv("train.csv")
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()
#写入代码
df.to_csv('test_pr.csv')

【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html
【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html

2.3.2 任务二:对文本变量进行转换

(1) 查看文本变量名及种类
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

#写入代码
# 查看你文本变量名及种类
# 方法一
df['Sex'].value_counts()
# 方法二
df['Sex'].unique()
# 方法三
df['Sex'].nunique()
#写入代码
# 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])

#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})

#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

df.head()
#写入代码
# 将文本变量Sex, Cabin, Embarked用one-hot编码表示
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)

df.head()

2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

#写入代码
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
#保存最终你完成的已经清理好的数据
df.to_csv('test_fin.csv')

标签:数据结构,--,pandas,Age,缺失,df,pd,Task02,csv
From: https://www.cnblogs.com/horolee/p/Task02_1.html

相关文章

  • 资深程序员在编程中有哪些特殊的习惯或方法?
    知乎上有一个问答:高级程序员在编程中有哪些特殊的习惯或方法?我是一个有着22年编程经验的老程序员,谈不上高级,我来谈谈自己的三点心得。一定要有自己的代码库以前有程......
  • day9
    1、KMP算法KMP的作用:KMP用于字符串匹配KMP的主要思想:当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。前缀表......
  • 【直播/实时监控】前端-直播实时监控基础知识点
    了解直播/实时监控需要掌握的背景知识......
  • [ros]4.客户端和服务端
    目录客户端实现创建功能包代码实现编译服务端实现创建功能包代码实现编译客户端实现和发布者不同的是客户端只有向服务端发出请求后服务端才会产生应答,这种机制应用在一......
  • P26_wxss - 样式导入
    样式导入什么是样式导入使用WXSS提供的@import语法,可以导入外联的样式表。@import的语法格式@import后跟需要导入的外联样式表的相对路径,用;表示语句结束。示......
  • 代码随想录算法训练营第九天 字符串总结 | 双指针回顾
    一刷中,暂时跳过KMP,今天状态也不太好,简单了解了一下,后面来补上。今天先整理一下字符串和双指针。字符串除去目前没有掌握的KMP,字符串类的题目除了各种反转类型外,还有需要......
  • 学习笔记——@PathVariable注解基本使用;@PathVariable注解属性;REST风格CRUD概述;实现PU
    2023-01-19一、@PathVariable注解基本使用1、获取URL中占位符2、占位符语法:{}3、实例代码:@RequestMapping("testPathVariable/{empId}")publicStringtestPath......
  • C#构造函数和析构函数
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceClassInit{internalclassP......
  • request.js
    前端向后端发起请求的时候1.vue安装axiosnpmiaxios-S2.request.js封装importaxiosfrom'axios'//这里面加入后端的地址constrequest=axios.create({......
  • P25_rpx单位
    模板样式-rpx什么是rpx尺寸单位rpx(responsivepixel)是微信小程序独有的,用来解决屏适配的尺寸单位。rpx的实现原理rpx的实现原理非常简单:鉴于不同设备屏幕的......