学习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.mfbz.cn/a/186492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

x-www-form-urlencoded的含义解释,getReader()和getParameter()的区别

1、x-www-form-urlencoded x-www-form-urlencoded是一种编码格式&#xff0c;它是一种常见的编码方式&#xff0c;用于在HTTP请求中 传输表单数据 。在这种编码方式下&#xff0c;表单数据被编码为URL格式&#xff0c;然后作为请求体&#xff08;payload&#xff09;发送。 需要…

前端大厂(腾讯、字节跳动、阿里......)校招面试真题解析,让你面试轻松无压力!

前言 校招很重要&#xff0c;应届生的身份很珍贵&#xff01;在校招的时候与我们竞争的大部分都是没有工作经验的学生&#xff0c;而且校招企业对学生的包容度高&#xff0c;一般对企业来说&#xff0c;社招更看重实际工作经验&#xff0c;而校招更愿意“培养人”&#xff0c;校…

FindMy技术用于旅行箱

旅行箱&#xff0c;那是出门在外的我们不可或缺的伙伴。无论是商务出差&#xff0c;还是短途旅行&#xff0c;亦或是长途度假&#xff0c;旅行箱都以其便捷的方式&#xff0c;陪伴着我们的整个行程。 然而&#xff0c;在旅途中&#xff0c;丢失旅行箱是一件非常棘手的问题&…

【Web】PhpBypassTrick相关例题wp

目录 ①[NSSCTF 2022 Spring Recruit]babyphp ②[鹤城杯 2021]Middle magic ③[WUSTCTF 2020]朴实无华 ④[SWPUCTF 2022 新生赛]funny_php 明天中期考&#xff0c;先整理些小知识点冷静一下 ①[NSSCTF 2022 Spring Recruit]babyphp payload: a[]1&b1[]1&b2[]2&…

【计算机网络笔记】数据链路层——差错编码

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

RK3588平台 USB框架与USB识别流程

一.USB的基本概念 在最初的标准里&#xff0c;USB接头有4条线&#xff1a;电源&#xff0c;D-,D,地线。我们暂且把这样的叫做标准的USB接头吧。后来OTG出现了&#xff0c;又增加了miniUSB接头。而miniUSB接头则有5条线&#xff0c;多了一条ID线,用来标识身份用的。 热插拔&am…

VR全景展示,“超前点播”打开娱乐行业线上营销门户

如今&#xff0c;人们的生活水平正在逐步提高&#xff0c;这种提高不仅仅是体现在衣食住行上&#xff0c;更多方面是体现在大众的娱乐活动上。我们可以看到&#xff0c;相比于过去娱乐种类的匮乏&#xff0c;现如今&#xff0c;各种娱乐活动可谓是百家争鸣&#xff0c;例如温泉…

03.依赖倒置原则(Dependence Inversion Principle)

概述 高层模块不应依赖低层模块&#xff0c;二者都应该依赖其抽象。而抽象不应依赖细节&#xff0c;细节应该依赖抽象。依赖倒置原则的中心思想其实就是面向接口编程。 相对于细节的多变性&#xff0c;抽象的东西会稳定的多&#xff0c;所以以抽象为基础搭建的架构自然也会比以…

最新Midjourney绘画提示词Prompt教程无需魔法

最新Midjourney绘画提示词Prompt教程无需魔法使用 一、AI绘画工具 SparkAi【无需魔法使用】&#xff1a; SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypes…

App 设计工具

目录 说明 打开 App 设计工具 示例 创建 App 创建自定义 UI 组件 打开现有 App 文件 打包和共享 App 本文主要讲述以交互方式创建 App。 说明 App 设计工具是一个交互式开发环境&#xff0c;用于设计 App 布局并对其行为进行编程。 可以使用 App 设计工具&#xff1a…

Python---函数的参数类型

位置参数 理论上&#xff0c;在函数定义时&#xff0c;我们可以为其定义多个参数。但是在函数调用时&#xff0c;我们也应该传递多个参数&#xff0c;正常情况&#xff0c;其要一一对应。 相关链接&#xff1a;Python---函数的作用&#xff0c;定义&#xff0c;使用步骤&…

1、postman的安装及使用

一、安装、登录 1.安装 下载地址 2.注册登录&#xff08;保存云服务进度&#xff09; 二、界面介绍 三、执行接口测试页面 请求页签&#xff1a; 1、params&#xff1a;当是get请求时&#xff0c;通过params传参 2、authorization&#xff1a;鉴权 3、headers&#xff1…

Ps:画笔工具的基本操作

画笔工具 Brush Tool是 Ps 中最常用的工具&#xff0c;广泛地用于绘画与修饰工作。 虽然多数操作可在画笔工具的工具选项栏中选择执行&#xff0c;但是如果能记住相应的快捷键可大大提高工作效率。 熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Ps 中许多…

超声波雪深传感器冬季里的科技魔法

在冬季的某个清晨&#xff0c;当你打开大门&#xff0c;被厚厚的积雪覆盖的大地映入眼帘&#xff0c;你是否曾想过&#xff0c;这片雪地的深度是多少&#xff1f;它又如何影响着我们的生活和环境&#xff1f;今天&#xff0c;我们将为你揭开这个谜团&#xff0c;介绍一款神秘的…

2023/11/24JAVAweb学习

age只会执行成立的,show其实都展示了,通过display不展示 使用Vue,必须引入Vue.js文件 假如运行报错,以管理员身份打开vscode,再运行 ------------------------------------------------------------------- 更改端口号

【web】Fastapi自动生成接口文档(Swagger、ReDoc )

简介 FastAPI是流行的Python web框架&#xff0c;适用于开发高吞吐量API和微服务&#xff08;直接支持异步编程&#xff09; FastAPI的优势之一&#xff1a;通过提供高级抽象和自动数据模型转换&#xff0c;简化请求数据的处理&#xff08;用户不需要手动处理原始请求数据&am…

web前端开发基础----标准流布局和非标准流布局

1&#xff0c;标准流布局 标准流&#xff0c;也称文档流或普通流&#xff0c;是所有元素默认的布局方式。 在标准流中&#xff0c;元素按照其在 HTML 中出现的顺序&#xff0c;自上而下依次排列&#xff0c;并占据其父容器内的可用空间。 标准流中的元素按照其自然尺寸和位置进…

系列二、IOC DI

一、IOC 1.1、概述 IOC的中文意思是控制反转&#xff0c;通俗地讲就是把创建对象的控制权交给Spring去管理&#xff0c;以前是由程序员自己去创建、控制对象&#xff0c;现在交由Spring去创建对象 & 管理对象&#xff08;维系对象之间的关系&#xff09;&#xff0c;使用I…

Zynq-Linux移植学习笔记之67- 国产ZYNQ上通过GPIO模拟MDC/MDIO协议

1、背景介绍 模块上有9个PHY&#xff0c;其中两个PHY通过ZYNQ PS端的MDIO总线连接&#xff0c;其余7个PHY单独通过GPIO进行控制&#xff0c;需要实现GPIO模拟MDC/MDIO协议。 2、vivado工程设计 vivado工程内为每个PHY建立两个GPIO IP核&#xff0c;分别用来代表MDC和MDIO&…

Arduino库之 LedControl 库说明文档

LedControl 库最初是为基于 8 位 AVR 处理器的 Arduino 板编写的。用于通过MAX7219芯片控制LED矩阵和7段数码管。但由于该代码不使用处理器的任何复杂的内部功能&#xff0c;因此具有高度可移植性&#xff0c;并且应该在任何支持 和 功能的 Arduino&#xff08;类似&#xff09…
最新文章