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)在某些编程语言中用NANone表示

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进行数据重排时,经常用到 stackunstack 两个函数。stack 的意思是堆叠、堆积,unstack 即"不要堆叠"

常见的数据的层次化结构有两种,一种是表格,一种是"花括号",即下面这样的两种形式:

stack函数会将数据从表格结构 变成 花括号结构(返回的是series类型),即将其列索引变成行索引,反之,unstack函数将数据从 花括号结构变成 表格结构,即要将其中一层的行索引变成列索引。

3.3wide_to_long 整理数据

wide_to_long函数的作用是将列名起始部分相同的列进行拆解,使宽数据变换为长数据

需求

  • 加载data/movie.csv数据,统计每部电影的每个主演的被点赞数,返回新的df
  • 新df 的列名为 movie_titleactor_numactoractor_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+大数据-数据处理与分析(三)-数据清洗相关推荐

  1. Python+大数据-数据处理与分析-pandas快速入门

    Python+大数据-数据处理与分析-pandas快速入门 1.Pandas快速入门 1.1DataFrame和Series介绍 1)DataFrame 用来处理结构化数据(SQL数据表,Excel表 ...

  2. Python +大数据-hadoop生态-hadoop(三)--Hadoop HDFS

    Python +大数据-hadoop生态-hadoop(三)–Hadoop HDFS 今日课程学习目标 理解分布式文件存储的概念与实现 掌握HDFS分块存储.副本机制等特性 学会shell操作HDFS ...

  3. Python + 大数据 - 数仓实战之智能电商分析平台

    Python + 大数据 - 数仓实战之智能电商分析平台 1. 项目架构 2. 数据仓库维度模型设计-事实表 事实表的特征:表里没有存放实际的内容,他是一堆主键的集合,这些ID分别能对应到维度表中的一 ...

  4. [转载] Python大数据文本分析及应用

    参考链接: 使用Python的SQL 3(处理大数据) 实践课题报告: 大数据文本分析与应用 学 校:xxx 学 院:大数据与智能工程学院 专 业:信息工程(数据科学与大数据技术) 年 级:2017级 ...

  5. python大数据可视化分析淘宝商品,开专卖店不行啊

    python大数据可视化分析淘宝商品,开专卖店不行啊 现如今大数据分析异常火爆,如何正确分析数据,并且抓住数据特点,获得不为人知的秘密?今天沉默带你用python爬虫,爬取淘宝网站进行淘宝商品大数据分 ...

  6. 【python】用python实现wordcloud大数据词云图分析

    [python]用python实现wordcloud大数据词云图分析 一.应用场景 二.工具包安装及代码 三.中文不能正常显示问题 四.关键词重复问题 五.最终结论 一.应用场景 大数据词云(word ...

  7. Python大数据:jieba分词,词频统计

    实验目的 学习如何读取一个文件 学习如何使用DataFrame 学习jieba中文分词组件及停用词处理原理 了解Jupyter Notebook 概念 中文分词 在自然语言处理过程中,为了能更好地处理 ...

  8. 大数据就业前景分析-好程序员

    大数据就业前景分析-好程序员,大数据广泛应用于电网运行.经营管理及优质服务等各大领域,并正在改变着各行各业,也引领了大数据人才的变革.大数据就业前景怎么样?这对于在就业迷途中的我们是一个很重要的信息. ...

  9. 《零起点,python大数据与量化交易》

    <零起点,python大数据与量化交易>,这应该是国内第一部,关于python量化交易的书籍. 有出版社约稿,写本量化交易与大数据的书籍,因为好几年没写书了,再加上近期"前海智库 ...

最新文章

  1. java 下载文件功能代码例子
  2. 强制结束后台作业(SAP SM37 SM35 SM50)
  3. python字典保存为excel_python将字典列表导出为Excel文件的方法
  4. XSS-Game level 10
  5. linux常用文件及作用总结(profile/.bashrc等)
  6. win11开机动画关闭教程
  7. 检查Oracle数据库和PDB数据库的大小
  8. Java使用itextpdf实现为已有的pdf文件添加水印
  9. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
  10. oracle连续月份列表,Oracle实现查询2个日期所跨过的月份列表/日期列表的方法分析...
  11. ArcGIS 图像合并至新栅格图层(Mosaic To New Raster和Mosaic)
  12. 开源社 2023年度理事会成员官宣
  13. HTTP的常用方法、GET和POST的区别
  14. 为什么市场为百度财报买单?
  15. UVA 1455 Kingdom 线段树+并查集
  16. WINCE 车机系统介绍
  17. 如何使用 Redis 实现 “附近的人” 这个功能?
  18. 中山大学计算机博士_中山大学数据科学与计算机学院2019申请审核制博士招生简章...
  19. Python开发过哪些知名网站和游戏?
  20. 快逸报表配置数据源的两种方式

热门文章

  1. 如何恢复被删除的文件?文件恢复,4招解决!
  2. 微分方程5_如何理解$e^i*pi
  3. 学历对一个程序员重要吗?是找工作还是考研?
  4. 数据库中的数据完整性(实体完整性、域完整性、引用完整性)
  5. 低智商的善良等于作恶
  6. matlab函数randperm()
  7. 【C语言】取整函数ceil()用法
  8. 如何做好教育直播,阿里云助力百家云打造双师课堂
  9. gflags使用示例
  10. java毕业设计—— 基于java+JavaEE+jsp的售后服务管理系统设计与实现(毕业论文+程序源码)——售后服务管理系统