学习Pandas 二(Pandas缺失值处理、数据离散化、合并、交叉表与透视表、分组与聚合)

文章目录

  • 六、高级处理-缺失值处理
    • 6.1 检查是否有缺失值
    • 6.2 缺失值处理
    • 6.3 不是缺失值NaN,有默认标记的
  • 七、高级处理-数据离散化
    • 7.1 什么是数据的离散化
    • 7.2 为什么要离散化
    • 7.3 如何实现数据的离散化
  • 八、高级处理-合并
    • 8.1 pc.concat实现合并,按方向进行合并
    • 8.2 pd.merge实现合并 按索引进行合并
  • 九、高级处理-交叉表与透视表
    • 9.1 交叉表与透视表有什么作用
    • 9.2 使用crosstab(交叉表)实现
    • 9.3 使用pivot_table(透视表)实现
  • 十、高级处理-分组与聚合
    • 10.1 什么是分组与聚合
    • 10.2 分组与聚合API
    • 10.3 星巴克零售店铺数据案例
  • 十一、综合案例
    • 总结


学习Pandas的基本操作:

学习Pandas 一(Pandas介绍、DataFrame结构、Series结构、Pandas基本数据操作、DataFrame运算、Pandas画图、文件读取与存储)

六、高级处理-缺失值处理

如何进行缺失值处理:
两种思路:
1、删除含有缺失值NaN的样本
2、替换/插补

判断数据是否存在NaN:
pd.isnull(df)
pd.notnull(df)

若存在缺失值:
1、删除存在缺失值的:dropna(axis=‘rows’, inplace=Ture/False)
inplace=True就地删除,False不会修改原数据,返回新的经过删除过缺失值的df,需要接受返回值

2、替换缺失值:fillna(value, inplace=True)
value是要填补的值,inplace=True修改原数据,False返回新的对象,默认都是False

6.1 检查是否有缺失值

判断是否有缺失值,False表示不是缺失值。还是需要用肉眼查看False与True

print(pd.isnull(movie))

使用Numpy中的any方法,只要有一个True,就返回True

print(np.any(pd.isnull(movie)))

判断是否有缺失值,True表示不是缺失值。还是需要用肉眼查看False与True

print(pd.notnull(movie))

Numpy中的all方法,只要有False就返回一个False

print(np.all(pd.notnull(movie)))

Pandas中的方法,返回的是每一个字段是否存在缺失值

print(pd.isnull(movie).any())

Pandas中的方法,返回的是每一个字段是否存在缺失值

print(pd.notnull(movie).all())

6.2 缺失值处理

1、方法一:删除含有缺失值的样本

movie1 = movie.dropna()
print(pd.notnull(movie).all())
print(pd.notnull(movie1).all())

2、方法二:替换和插补,以每列平均值来替换

movie['Revenue (Millions)'].fillna(movie['Revenue (Millions)'].mean(), inplace=True)
movie['Metascore'].fillna(movie['Metascore'].mean(), inplace=True)
print(pd.notnull(movie).all()) # 缺失值处理完毕,已经不存在缺失值了

6.3 不是缺失值NaN,有默认标记的

替换:将标记?替换为NaN;再按np.NaN缺失值步骤来

data_new = data.replace(to_replace='?', value=np.nan)
print(data_new[21:40])
data_new.dropna(inplace=True) # 原数据上删除含有缺失值的样本
print(data_new.isnull().any())

总结:

isnull、notnull判断是否存在缺失值
dropna删除np.nan标记的缺失值
fillna填充缺失值
replace替换具体某些值

七、高级处理-数据离散化

7.1 什么是数据的离散化

连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。

离散化有很多种方法。这里使用一种最简单的方式去操作:
原始的身高数据:165,174,160,180,159,163,192,184。
假设按照身高分几个区间段:(150,165],(165,180],(180,195]。
这样我们将数据分到了三个区间段,对应的标记为矮,中,高,最终要处理成一个“哑变量”(one-hot编码)矩阵:
在这里插入图片描述

7.2 为什么要离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

7.3 如何实现数据的离散化

1、对数据分组
自动分组:sr=pd.qcut(data, bins) # bins为分成几组
自定义分组:sr=pd.cut(data, []) # []为自定义分组区间
Series.value_counts():统计分组次数。对数据进行分组一般会与value_counts搭配使用,统计每组的个数

2、对分组好的结果转换成哑变量(one-hot编码)
pd.get_dummies(sr, prefix=) # prefix为分组名字

# 准备数据
data = pd.Series([165, 174, 160, 180, 159, 163, 192, 184],index=['No1:165 ', 'No2:174', 'No3:160', 'No4:180 ', 'No5:159', 'No6:163', 'No7:192 ', 'No8:184'])
print(data)
# 分组
# sr = pd.qcut(data, 3) # 自动分组
bins = [150, 165, 180, 195]
sr = pd.cut(data, bins) # 自定义分组
print(type(sr)) # <class 'pandas.core.series.Series'>
print(sr)
print(sr.value_counts()) # 查看分组情况
# 转换成one-hot编码
print(pd.get_dummies(sr, prefix='身高', dtype=int))

八、高级处理-合并

如果你的数据由多张表组成,那么有时需要将不同的内容合并在一起分析。

8.1 pc.concat实现合并,按方向进行合并

pd.concat([data1, data2],axis=1):按照行或列进行合并,axis=0为列索引(竖直拼接),axis=1为行索引(水平拼接),默认为0。

stock = pd.read_csv('./file_csv/stock_day.csv')
print(stock.head())
p_change = stock['p_change'].head()
print(p_change)
print(pd.concat([stock, p_change], axis=1).head())

8.2 pd.merge实现合并 按索引进行合并

pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)

  • left:a DataFrame object
  • right:Another DataFrame object
  • on:索引
  • how:left/right/outer/inner(左连接/右连接/外连接/内连接),默认内连接
  • left_on=None,right_on=None:指定左右键
# 准备数据
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],'key2': ['K0', 'K1', 'K0', 'K1'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print(right)
result = pd.merge(left, right, on=['key1', 'key2'], how='inner') # 内连接
# result = pd.merge(left, right, on=['key1', 'key2'], how='outer') # 外连接
# result = pd.merge(left, right, on=['key1', 'key2'], how='left') # 左连接
# result = pd.merge(left, right, on=['key1', 'key2'], how='right') # 右连接
print(result)

九、高级处理-交叉表与透视表

9.1 交叉表与透视表有什么作用

找到、探索两个变量之间的关系。

9.2 使用crosstab(交叉表)实现

交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)。
pd.crosstab(value1, value2)

# 数据准备:准备两列数据,星期数据以及涨跌幅是好是坏数据,进行交叉计算
# pd.crosstab(星期数据列, 涨跌幅数据列)
stock = pd.read_csv('./file_csv/stock_day.csv')
# 1、准备星期数据列
# print(stock.index) # 转换为DatetimeIndex类型,方便用
# pandas日期类型
date = pd.to_datetime(stock.index)
print(date)
stock['week'] = date.weekday
print(stock.head())
# 2、准备涨跌幅数据列
stock['pona'] = np.where(stock['p_change'] > 0, 1, 0)
print(stock.head())
# 3、调用交叉表
data = pd.crosstab(stock['week'], stock['pona'])
print(data)
print(data.sum(axis=1))
print(data.div(data.sum(axis=1), axis=0))
data.div(data.sum(axis=1), axis=0).plot(kind='bar', stacked=True) # 柱状图
plt.show()

在这里插入图片描述

9.3 使用pivot_table(透视表)实现

DataFrame.pivot_table([], index=[]),使用透视表,上述过程更加简单。

stock = pd.read_csv('./file_csv/stock_day.csv')
date = pd.to_datetime(stock.index)
stock['week'] = date.weekday
stock['pona'] = np.where(stock['p_change'] > 0, 1, 0)
print(stock.head())
print(stock.pivot_table(['pona'], index=['week']))

十、高级处理-分组与聚合

10.1 什么是分组与聚合

分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况。

10.2 分组与聚合API

DataFrame.groupby(key, as_index=False)
key:分组的列数据,可以多个

col =pd.DataFrame({'color': ['white', 'red', 'green', 'red', 'green'],'object': ['pen', 'pencil', 'pencil', 'ashtray', 'pen'],'price1':[5.56, 4.20, 1.30, 0.56, 2.75],'price2':[4.75, 4.12, 1.60, 0.75, 3.15]})
print(col)
# 进行分组,对颜色分组,price1进行聚合
# 用dataframe的方法进行分组
print(col.groupby(by='color')['price1'].max()) # 按颜色进行分组,然后按price1进行聚合,求每个颜色的最大值
# 用series方法进行分组
print(col['price1'].groupby(col['color']).max())

10.3 星巴克零售店铺数据案例

# 从文件中读取星巴克店铺数据
starbucks = pd.read_csv('./file_csv/directory.csv')
# print(starbucks.head())# 按照国家分组,求出每个国家的星巴克零售店数量
count = starbucks.groupby(by='Country').count()
# print(count)starbucks_count = starbucks.groupby("Country").count()["Brand"].sort_values(ascending=False)[:10] # 分组聚合之后排序取前十行
starbucks_count.plot(kind="bar", figsize=(7, 4), fontsize=6)
plt.show()

在这里插入图片描述

十一、综合案例

需求:
1、想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么样获取?
2、对于这一组电影数据,如果我们想看Rating、Runtime(Minutes)的分布情况,应该如何呈现数据?
3、对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?

实现

# 准备数据
movie = pd.read_csv('./file_csv/IMDB-Movie-Data.csv')
# print(movie.head())
print(movie.shape)# 1、想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么样获取?
print(movie['Rating'].mean()) # 评分的平均分
print(np.unique(movie['Director']).size) # 导演的人数# 2、对于这一组电影数据,如果我们想看Rating、Runtime (Minutes)的分布情况,应该如何呈现数据?
movie['Rating'].plot(kind='hist',figsize=(8, 4))
plt.show()
movie['Runtime (Minutes)'].plot(kind='hist',figsize=(8, 4))
plt.show()# 3、对于这一组电影数据,如果我们希望统计电影分类(Genre)的情况,应该如何处理数据?
# 先统计电影类别都有哪些
# print(movie['Genre'])
movie_genre = [i.split(',') for i in movie['Genre']] # 一部电影,有多个类别,先把每一部类型以列表显示
# print(movie_genre)
movie_class = np.unique([j for i in movie_genre for j in i]) # 把一个二维列表化成一维列表,再去重存储在movie_class
print(movie_class)
print(len(movie_class)) # 20
# 统计每个类别,有几个电影
count = pd.DataFrame(np.zeros(shape=[100, 20], dtype='int32'), columns=movie_class)
print(count)
# 计数填表
for i in range(1000): # movie的形状是(1000, 12)count.loc[i, movie_genre[i]] = 1
print(count)
count.sum(axis=0).sort_values(ascending=False).plot(kind="bar", figsize=(10, 5), fontsize=20, colormap="cool")
plt.show()

在这里插入图片描述


总结

一步一个脚印,lyy加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/202740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?

1.什么是进程&#xff1f; 进程是操作系统中一个程序在执行过程中的一个实例&#xff0c;每个进程都有自己独立的地址空间&#xff0c;进程间不共享内存。它是程序运行的最小内存单元&#xff1b; 进程特点&#xff1a; 1> 需要占用独立的内存空间&#xff1b; 2>可以并…

2023年最新PyCharm安装详细教程及pycharm配置

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads&#xff0c;进入二级页面&#xff0c;选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

【前沿技术了解】web图形Canvas、svg、WebGL、数据可视化引擎的技术选型

目录 Canvas&#xff1a;HTML5新增 Canvas标签&#xff08;画布&#xff09; 渲染上下文canvas.getContext(contextType[, contextAttributes]) 上下文类型&#xff08;contextType&#xff09; 上下文属性 (contextAttributes) 示例 动画 setInterval(function, delay)…

ElasticSearch02

ElasticSearch客户端操作 ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ 实际开发中&#xff0c;主要有三种方式可以作为elasticsearch服务的客户端&#xff1a; 第一种&#xff0c;使用elasticsearch提供的Restful接口…

从0到1建立前端规范

本文适合打算建立前端规范的小伙伴阅读 一、为什么需要规范 规范能给我们带来什么好处&#xff0c;如果没有规范会造成什么后果&#xff1f;这里主要拿代码规范来说。 统一代码规范的好处&#xff1a; 提高代码整体的可读性、可维护性、可复用性、可移植性和可靠性&#xf…

Ubuntu 22.04.3编译AOSP13刷机

文章目录 设备信息下载AOSP并切换分支获取设备驱动编译系统编译遇到的问题Cannot allocate memoryUbuntu设置USB调试刷机参考链接 设备信息 手机&#xff1a;Pixel 4XL 下载AOSP并切换分支 在清华大学开源软件镜像站下载初始化包aosp-latest.tar。 解压缩&#xff0c;切换到…

Hexo 还是 Hugo?Typecho 还是 Wordpress?读完这篇或许你就有答案了!

Hexo 首先介绍的是 Hexo,这也是咕咕没买服务器之前折腾的第一个博客。 演示站点:https://yirenliu.cn 用的主题是 butterfly,想当年刚用的时候,作者还没建群,现在 qq 群都有上千人了,GitHub 上的星星数量也有 2.7k 了。 优点 如果你不想买服务器,但也想折腾一个博客,…

【Web-Note】 JavaScript概述

JavaSript基本语法 JavaSript程序不能独立运行&#xff0c;必须依赖于HTML文件。 <script type "text/javascript" [src "外部文件"]> JS语句块; </script> script标记是成对标记。 type属性&#xff1a;说明脚本的类型。 "text/jav…

【全栈开发】RedwoodJS与BlitzJS:全栈JavaScript元框架的未来

Redwood和Blitz是两个即将出现的全栈元框架&#xff0c;它们提供了创建SPAs、服务器端渲染页面和静态生成内容的工具&#xff0c;并提供了生成端到端支架的CLI。我一直在等待一个有价值的Rails JavaScript替代品&#xff0c;谁知道什么时候。这篇文章是对两者的概述&#xff0c…

【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

C实现日期类 ├─属性&#xff1a; │ ├─年份 │ ├─月份 │ └─日期 ├─方法&#xff1a; │ ├─构造函数 │ ├─拷贝构造函数 │ ├─析构函数 │ ├─设置年份 │ ├─设置月份 │ ├─设置日期 │ ├─获取年份 │ ├─获取月份 │ ├─获取日期 │ ├…

HTML新特性【缩放图像、图像切片、平移、旋转、缩放、变形、裁切路径、时钟、运动的小球】(二)-全面详解(学习总结---从入门到深化)

目录 绘制图像_缩放图像 绘制图像_图像切片 Canvas状态的保存和恢复 图形变形_平移 图形变形_旋转 图形变形_缩放 图形变形_变形 裁切路径 动画_时钟 动画_运动的小球 引入外部SVG 绘制图像_缩放图像 ctx.drawImage(img, x, y, width, height) img &#xf…

C# 使用NPOI操作Excel的工具类

写在前面 NPOI是POI项目的.NET迁移版本。POI是一个开源的Java 读写 Excel、Word 等微软Ole2组件文档的项目&#xff1b;使用NPOI可以在没有安装Office或者相应环境的机器上对Word或Excel文档进行读写操作。 NPOI类库中操作EXCEL有两个模块分别是&#xff1a; 1️.HSSF模块&a…

Spring Beans;Spring Bean的生命周期;spring Bean的作用域,spring处理线程并发问题

文章目录 Spring Beans请解释Spring Bean的生命周期解释Spring支持的几种bean的作用域Spring容器中的bean可以分为5个范围&#xff1a; Spring如何处理线程并发问题&#xff1f; 在现在的项目开发中经常使用到spring bean&#xff0c;那么来谈谈spring bean的生命周期&#xff…

Lua脚本解决redis实现的分布式锁多条命令原子性问题

线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删除锁&#xff0c;但是此时他的锁到期了&#xff0c;那么此时线程2…

(三) Windows 下 Sublime Text 3 配置Python环境和Anaconda代码提示

一&#xff1a;新建一个 Python3.7 编译环境。 1 Tools--Build System--New Build System... 修改前&#xff1a; 修改后&#xff1a; 内容&#xff1a; {"cmd":["C:\\Python\\Python37-32\\python.exe","-u","$file"],"file_r…

复数的几何意义

1、复平面&#xff0c;复数的其它表示法 (1)几何表示法 直角平面坐标&#xff1a; 复平面 实轴&#xff0c;虚轴 (2)向量表示法 向量 模&#xff1a; 复数加减法可用向量的三角形法则或者平行四边形法则 (3)结论 (两边之和大于第三边) ((两边之差大于第三边)) *辐角&am…

FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)

文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址 1、业务需求 目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表Ta…

pytorch安装GPU版本 (Cuda12.1)教程

使用本教程前&#xff0c;默认您已经安装并配置好了python3以上版本 1. 去官网下载匹配的Cuda Cuda下载地址 当前最高版本的Cuda是12.1 我安装的就是这个版本 小提示&#xff1a;自定义安装可以只选择安装Cuda Runtime。Nvidia全家桶不必全部安装。把全家桶全部安装完直接系统…

机器人规划算法——movebase导航框架源码分析

这里对MoveBase类的类成员进行了声明&#xff0c;以下为比较重要的几个类成员函数。 构造函数 MoveBase::MoveBase | 初始化Action 控制主体 MoveBase::executeCb收到目标&#xff0c;触发全局规划线程&#xff0c;循环执行局部规划 全局规划线程 void MoveBase::planThread |…

【小黑送书—第五期】>>《MATLAB科学计算从入门到精通》

从代码到函数&#xff0c;从算法到实战&#xff0c;从问题到应用&#xff0c;由浅入深掌握科学计算方法&#xff0c;高效解决实际问题。 从代码到函数&#xff0c;掌握多种经典算法 跨越多个领域&#xff0c;精通各类科学计算 多种应用实例&#xff0c;高效解决实际问题 今天给…