Python+大数据-数据处理与分析(三)-数据清洗
Python+大数据-数据处理与分析(三)-数据清洗
1. 数据组合
1.1 数据聚合简介
在动手进行数据分析工作之前,需要进行数据清理工作,数据清理的主要目标是:
- 每个观测值成一行
- 每个变量成一列
- 每种观测单元构成一张表格
数据整理好之后,可能需要多张表格组合到一起才能进行某些问题的分析
- 比如:一张表保存公司名称,另一张表保存股票价格
- 单个数据集也可能会分割成多个,比如时间序列数据,每个日期可能在一个单独的文件中
1.2 concat拼接数据
基本格式:
方法 | 说明 |
---|---|
pd.concat([df1, df2, ..])
|
多个数据集(DataFrame或Series)之间按行标签索引 或列标签索引拼接,默认是outer,可以设置为inner |
1.2.1 行拼接:按照列标签索引对齐
# 将 df1、df2和 df3 按照列标签对齐,进行行拼接
row_concat = pd.concat([df1, df2, df3])
row_concat
# ignore_index=True:表示 concat 拼接时忽略索引
pd.concat([df1, df2, df3], ignore_index=True)
1.2.2 列拼接:按照行标签索引对齐
# 将 df1、df2和 df3 按照行标签对齐,进行列拼接
pd.concat([df1, df2, df3], axis=1)
1.2.3 join 参数的设置
concat 方法的 join参数:
- 默认为 outter:无法对齐的行/列,默认在拼接后的数据中会填充为 NaN,因为默认拼接是 outter 拼接
- 设置为 inner:只有能够对齐的行/列,才会出现在拼接的结果中
#将 df1 和 df3 按列标签对齐,进行行拼接,设置 join='inner'
pd.concat([df1, df3], join='inner')
1.3 merge 关联数据
merge 方法类似于 sql 中的 join 语句,用于两个数据集之间按照行标签索引|列标签索引链接,默认是inner,可以设置为:left、right、outer
基本格式:
方法 | 说明 |
---|---|
pd.merge(left, right, ...) 或 left.merge(right, ...)
|
两个数据集直接进行关联操作 |
merge函数的参数:
- left:左侧数据集
- right:右侧数据集
- how:关联方式,默认为 inner,可以设置为:left、right、outer
- on=‘列名’: 左侧和有则数据以哪一列进行关联操作,左右两侧列名相同时才指定 on 参数
- left_on=‘左侧列名’ 和 right_on=‘右侧列名’:左右两侧关联时,列名不同时使用
- left_index=False:默认为 False,设置为 True,表示左侧的行标签和右侧的数据进行关联
- right_index=False:默认为 False,设置为 True,表示左侧的数据和右侧的行标签进行关联
1.4 join 关联数据
join 方法类是 merge 方法的一个特殊情况,被调用的数据集按照行标签索引|列标签索引和另一个数据集的行标签索引关联,默认是left,可以设置为:right,inner、outer
基本格式:
方法 | 说明 |
---|---|
df.join(other, ...)
|
左侧数据集的行标签或列标签和右侧数据集的行标签进行关联操作 |
join函数的参数:
- other:右侧数据集
- how:关联方式,默认为 left,可以设置为:right、inner、outer
- on=‘左侧行标签或列标签’: 左侧数据集的行标签名称或列标签名称,on省略时,默认为左侧数据行标签
- lsuffix:关联后的数据中出现相同列名时,lsuffix指定左侧数据集出现相同列名的后缀
- rsuffix:关联后的数据中出现相同列名时,rsuffix指定右侧数据集出现相同列名的后缀
2.缺失值处理
2.1 pandas 缺失值 NaN 简介
在实际进行数据处理的过程中,很多数据集都含缺失数据。
缺失数据有多重表现形式:
1)数据库中,缺失数据表示为NULL
2)在某些编程语言中用NA
或None
表示
3)缺失值也可能是空字符串''
或数值 0
4)在 pandas 中使用 NaN
表示缺失值
- pandas 中的 NaN 值来自 NumPy 库
- NumPy 中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
注意点1:缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串
注意点2:两个NaN也不相等
pandas 判断是否为缺失值方法:
方法 | 说明 |
---|---|
pd.isnull(obj) 或 pd.isna(obj)
|
判断 obj 是否为缺失值 |
2.2缺失值处理
字段介绍:
字段名 | 说明 |
---|---|
PassengerId
|
乘客的ID |
Survived
|
乘客是否获救,0:没获救,1:已获救 |
Pclass
|
乘客船舱等级(1/2/3三个等级舱位) |
Name
|
乘客姓名 |
Sex
|
性别 |
Age
|
年龄 |
SibSp
|
乘客在船上的兄弟姐妹/配偶数量 |
Parch
|
乘客在船上的父母/孩子数量 |
Ticket
|
船票号 |
Fare
|
船票价 |
Cabin
|
客舱号码 |
Embarked
|
登船的港口 |
2.3总结
- 数据中包含缺失值是很常见的情况,缺失值可能在很多环节产生(用户没填,程序错误,数据合并…)
- pandas中用np.NaN 表示缺失值,通过pd.isnull()或者pd.notnull()来判断是否是缺失值
- 常用的缺失值处理方式
- 删除缺失值
- 按行删除
- 按列删除
- 填充缺失值
- 默认值填充
- 统计值填充
- 用前、后值填充
- 线性插值填充
- 删除缺失值
3. 数据整理
3.1 melt整理数据
3.1.1 宽数据集变为长数据集
# 加载数据
#加载美国收入与宗教信仰数据 pew.csv
pew = pd.read_csv('./data/pew.csv')
pew.head()pew_long = pd.melt(pew, id_vars=['religion'])
pew_long
结果说明:
1)我们发现,基于religion列,把原来的df拉长了,我们称原来的df为宽数据集
,拉长之后的df称之为长数据集
- 对于展示数据而言,下图中
pew
返回的这种"宽"数据没有任何问题,如第一行数据,展示了Agnostic(不可知论(者))所有的收入分布情况 - 从数据分析的角度,有时候我们需要把数据由"宽"数据,转换成"长"数据,就如同下图中
pew_long
返回的数据 - 在pandas中我们就可以使用
df.melt()
函数,通过各种参数,来达成宽数据集转换为长数据集的效果
3.1.2 melt 函数的参数
melt 是溶解/分解的意思, 即拆分数据;melt即是类函数也是实例函数,也就是说既可以用pd.melt()
, 也可使用dataframe.melt()
参数 | 类型 | 说明 |
---|---|---|
frame | dataframe |
必要参数,被 melt 的数据集名称在 pd.melt() 中使用,比如上例中pd.melt(pew, id_vars='religion') 的pew
|
id_vars | tuple/list/ndarray |
可选项,不需要被转换的列名,在转换后作为标识符列(不是索引列),比如上例pd.melt(pew, id_vars='religion')
|
value_vars | tuple/list/ndarray | 可选项,需要被转换的现有列,如果未指明value_vars,除id_vars指定的其他列都将被转换 |
var_name | string | 自定义设置variable列的列名 |
value_name | string | 自定义设置value列的列名 |
3.2stack 整理数据
pandas进行数据重排时,经常用到 stack
和 unstack
两个函数。stack
的意思是堆叠、堆积,unstack
即"不要堆叠"
常见的数据的层次化结构有两种,一种是表格,一种是"花括号",即下面这样的两种形式:
stack函数会将数据从表格结构
变成 花括号结构
(返回的是series类型),即将其列索引变成行索引,反之,unstack函数将数据从 花括号结构
变成 表格结构
,即要将其中一层的行索引变成列索引。
3.3wide_to_long 整理数据
wide_to_long函数的作用是将列名起始部分相同的列进行拆解,使宽数据变换为长数据
需求:
- 加载
data/movie.csv
数据,统计每部电影的每个主演的被点赞数,返回新的df - 新df 的列名为
movie_title
、actor_num
、actor
、actor_facebook_likes
:分别代表电影名称、演员编号、演员姓名、该演员被点赞数
3.4 总结
- melt、stack、wide_to_long函数均可以实现将宽数据整理成长数据
- melt:指定数据列,将指定列变成长数据
- stack:返回一个具有多层级索引的数据,配合reset_index可以实现宽数据变成长数据
- wide_to_long:处理列名带数字后缀的宽数据
- stack/unstack, melt/pivot_table 互为逆向操作
4. pandas数据类型
4.1 pandas 数据类型简介
4.1.1 Numpy介绍
Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
1)Numpy 支持常见的数组和矩阵操作
- 对于同样的数值计算任务,使用 Numpy 比直接使用 Python 要简洁的多
2)Numpy 使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器
比如我们现在对下面表格中的数据用 Numpy 的 ndarray 类型来存储:
Numpy ndarray的优势:
1)数据在内存中存储的风格
- ndarray 在存储数据时所有元素的类型都是相同的,数据内存地址是连续的,批量操作数组元素时速度更快
- python 原生 list 只能通过寻址方式找到下一个元素,这虽然也导致了在通用性方面 Numpy 的 ndarray 不及python 原生 list,但计算的时候速度就慢了
4.1.2 Numpy 的 ndarray
ndarray的属性清单:
属性 | 说明 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
- 下表为ndarray的全部数据类型;最常用的类型是布尔和int64,其他只要了解就好:
名称 | 描述 | 简写 |
---|---|---|
np.bool | 用一个字节存储的布尔类型(True或False) | ‘b’ |
np.int8 | 一个字节大小,-128 至 127 | ‘i’ |
np.int16 | 整数,-32768 至 32767 | ‘i2’ |
np.int32 | 整数,-2的31次方 至 2的32次方 -1 | ‘i4’ |
np.int64 | 整数,-2的63次方 至 2的63次方 - 1 | ‘i8’ |
np.uint8 | 无符号整数,0 至 255 | ‘u’ |
np.uint16 | 无符号整数,0 至 65535 | ‘u2’ |
np.uint32 | 无符号整数,0 至 2的32次方 - 1 | ‘u4’ |
np.uint64 | 无符号整数,0 至 2的64次方 - 1 | ‘u8’ |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | ‘f2’ |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | ‘f4’ |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | ‘f8’ |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | ‘c8’ |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | ‘c16’ |
np.object_ | python对象 | ‘O’ |
np.string_ | 字符串 | ‘S’ |
np.unicode_ | unicode类型 |
4.1.3 pandas 的数据类型
pandas 是基于 Numpy 的,很多功能都依赖于 Numpy 的 ndarray 实现的,pandas 的数据类型很多与 Numpy 类似,属性也有很多类似。比如 pandas 数据中的 NaN 就是 numpy.nan
下图中为 pandas 的数据类型清单,其中 category 我们之前的学习中没有见过的:
- category 是由固定的且有限数量的变量组成的。比如:性别、社会阶层、血型、国籍、观察时段、赞美程度等等。
- category 类型的数据可以具有特定的顺序。比如:性别分为男、女,血型ABO。我们会在本章节的最后来了解这种数据类型。
4.2 类型转换
4.2.1 astype函数
astype方法是通用函数,可用于把DataFrame中的任何列转换为其他dtype
可以向astype方法提供任何内置类型或numpy类型来转换列的数据类型
4.2.2 转换为字符串对象
在上面的tips数据中,sex、smoker、day 和 time 变量都是category类型。通常,如果变量不是数值类型,应先将其转换成字符串类型以便后续处理
有些数据集中可能含有id列,id的值虽然是数字,但对id进行计算(求和,求平均等)没有任何意义,在某些情况下,可能需要把它们转换为字符串对象类型。
1)把一列的数据类型转换为字符串,可以使用 astype
方法:
tips['sex_str'] = tips['sex'].astype(str)
print(tips.dtypes)
4.3 总结
- Numpy 的特点
- Numpy 是一个高效科学计算库,pandas 的数据计算功能是对 Numpy 的封装
- ndarray 是 Numpy 的基本数据结构,pandas 的 Series 和 DataFrame 好多函数和属性都与 ndarray 一样
- Numpy 的计算效率比原生 Python 效率高很多,并且支持并行计算
- pandas 数据类型转换
- pandas 除了数值型的 int 和 float 类型外,还有object、category、bool、datetime类型
- 可以通过 as_type 和 to_numeric 函数进行数据类型转换
- pandas 分类数据类型
- category 类型,可以用来进行排序,并且可以自定义排序顺序
- CategoricalDtype 可以用来定义顺序
Python+大数据-数据处理与分析(三)-数据清洗相关推荐
- Python+大数据-数据处理与分析-pandas快速入门
Python+大数据-数据处理与分析-pandas快速入门 1.Pandas快速入门 1.1DataFrame和Series介绍 1)DataFrame 用来处理结构化数据(SQL数据表,Excel表 ...
- Python +大数据-hadoop生态-hadoop(三)--Hadoop HDFS
Python +大数据-hadoop生态-hadoop(三)–Hadoop HDFS 今日课程学习目标 理解分布式文件存储的概念与实现 掌握HDFS分块存储.副本机制等特性 学会shell操作HDFS ...
- Python + 大数据 - 数仓实战之智能电商分析平台
Python + 大数据 - 数仓实战之智能电商分析平台 1. 项目架构 2. 数据仓库维度模型设计-事实表 事实表的特征:表里没有存放实际的内容,他是一堆主键的集合,这些ID分别能对应到维度表中的一 ...
- [转载] Python大数据文本分析及应用
参考链接: 使用Python的SQL 3(处理大数据) 实践课题报告: 大数据文本分析与应用 学 校:xxx 学 院:大数据与智能工程学院 专 业:信息工程(数据科学与大数据技术) 年 级:2017级 ...
- python大数据可视化分析淘宝商品,开专卖店不行啊
python大数据可视化分析淘宝商品,开专卖店不行啊 现如今大数据分析异常火爆,如何正确分析数据,并且抓住数据特点,获得不为人知的秘密?今天沉默带你用python爬虫,爬取淘宝网站进行淘宝商品大数据分 ...
- 【python】用python实现wordcloud大数据词云图分析
[python]用python实现wordcloud大数据词云图分析 一.应用场景 二.工具包安装及代码 三.中文不能正常显示问题 四.关键词重复问题 五.最终结论 一.应用场景 大数据词云(word ...
- Python大数据:jieba分词,词频统计
实验目的 学习如何读取一个文件 学习如何使用DataFrame 学习jieba中文分词组件及停用词处理原理 了解Jupyter Notebook 概念 中文分词 在自然语言处理过程中,为了能更好地处理 ...
- 大数据就业前景分析-好程序员
大数据就业前景分析-好程序员,大数据广泛应用于电网运行.经营管理及优质服务等各大领域,并正在改变着各行各业,也引领了大数据人才的变革.大数据就业前景怎么样?这对于在就业迷途中的我们是一个很重要的信息. ...
- 《零起点,python大数据与量化交易》
<零起点,python大数据与量化交易>,这应该是国内第一部,关于python量化交易的书籍. 有出版社约稿,写本量化交易与大数据的书籍,因为好几年没写书了,再加上近期"前海智库 ...
最新文章
- java 下载文件功能代码例子
- 强制结束后台作业(SAP SM37 SM35 SM50)
- python字典保存为excel_python将字典列表导出为Excel文件的方法
- XSS-Game level 10
- linux常用文件及作用总结(profile/.bashrc等)
- win11开机动画关闭教程
- 检查Oracle数据库和PDB数据库的大小
- Java使用itextpdf实现为已有的pdf文件添加水印
- 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
- oracle连续月份列表,Oracle实现查询2个日期所跨过的月份列表/日期列表的方法分析...
- ArcGIS 图像合并至新栅格图层(Mosaic To New Raster和Mosaic)
- 开源社 2023年度理事会成员官宣
- HTTP的常用方法、GET和POST的区别
- 为什么市场为百度财报买单?
- UVA 1455 Kingdom 线段树+并查集
- WINCE 车机系统介绍
- 如何使用 Redis 实现 “附近的人” 这个功能?
- 中山大学计算机博士_中山大学数据科学与计算机学院2019申请审核制博士招生简章...
- Python开发过哪些知名网站和游戏?
- 快逸报表配置数据源的两种方式