【python】Pandas 数据分析之分组聚合操作|代码讲解|建议在Jupyter Notebook 中运行

news2024/9/22 1:08:02

建议在Jupyter Notebook 中运行
jupyter notebook环境搭建

文章目录

  • 1. Pandas加载数据
    • 1.1 根据 列名 加载数据
    • 1.2 根据 行 加载数据
    • 1.3 加载 指定行, 指定列 的数据
  • 2. 分组聚合
  • 3. Pandas基本绘图
  • 5. 常用的排序函数
    • 5.1 找到 小成本 高口碑的电影
    • 5.2 找到每年 imdb评分最高的电影.
    • 5.3 提取每年, 每种电影分级中 预算少的电影.

import numpy as np
import pandas as pd
import os

os.chdir(r'D:\hm\homework\pywork\workProject\numpyProject')  # 改变当前的工作目录.  change current work directory

1. Pandas加载数据

# 1. 读取文件, 获取df对象.

df = pd.read_csv('data/gapminder.tsv', sep='\t')
df.head()

1.1 根据 列名 加载数据

# 场景1: 加载1列数据. 

# 格式: df['列名'] 或者 df.列名

df['country']
df.country

# 场景2: 加载多列数据.

# 格式: df[['列名1', '列名2'...]]

df[['country', 'year', 'lifeExp']]

1.2 根据 行 加载数据

# head(), 默认是前5行

df.head()
df.head(n=2)  # 前2行

# tail(), 默认是后5行

df.tail()
df.tail(n=3)  # 后3行 
df.tail(n=1)  # 最后1行 

# loc: 根据 索引列 来获取数据的. 

df.loc[0]  # 第1行 => Series对象
df.loc[[0, 1, 2]]  # 第1, 2, 3行 => DataFrame对象

# df.loc[-1]              # 最后一行, 如果写-1, 则: 报错.

# iloc: 根据 行号 来获取数据的. 

df.iloc[0]  # 第1行 => Series对象
df.iloc[[0, 1, 2]]  # 第1, 2, 3行 => DataFrame对象

df.iloc[-1]  # 最后一行

1.3 加载 指定行, 指定列 的数据

# 格式: df对象.loc[[行], [列]]        # 索引列值 + 列名 的方式获取.

# 格式: df对象.iloc[[行], [列]]       # 行号 + 列的编号(索引) 的方式获取.

# 1. 精准的获取某几行的, 某几列.

df.loc[[0, 21, 211], :]  # : 可以代表: 所有行, 所有列.
df.loc[[0, 21, 211], ['country', 'year', 'lifeExp']]  # 获取指定列
df.iloc[[0, 21, 211], [0, 2, 3]]  # 获取指定列

# 2. 获取所有行的某几列.

# 写法1: 直接传入 列名 或者 列的索引

df.loc[:, ['continent', 'pop']]
df.iloc[:, [1, 4]]

# 写法2: 可以通过 range方式来生成 索引.

df.iloc[:, range(1, 5, 2)]  # 所有行, 索引为:1, 3列的信息.
df.loc[:, ['continent', 'lifeExp']]

# 写法3: 可以通过 切片的方式来生成索引.

df.iloc[:, 1:4]  # 所有行, 索引为:1, 2, 3列的信息, 包左不包右.
df.loc[:, ['continent', 'year', 'lifeExp']]

# 3. 下述代码, 执行结果是什么.

df.loc[range(0, 10, 2), ['lifeExp', 'pop']]
df.iloc[range(0, 10, 2), 3: 5]  # 第0, 2, 4, 6, 8行,  第3, 4列
df.iloc[range(10, -1, -2), 3: 5]
df.iloc[range(10, -2, -1), 3: 5]  # 10 ~ -1 => -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  共12条数据

2. 分组聚合

# 格式: df对象.groupby([分组的列名1, 分组的列名2...])[[要被聚合操作的字段1, 字段2...]].聚合函数名()

# 上述格式的语法糖, 如果分组字段只有1个, 且聚合字段也只有1个, 则可以简写为: df对象.groupby('分组字段')['聚合字段'].聚合函数名()

# 场景1: 分组字段 和 聚合字段都只有1个.

# 需求1: 每年的平均预期寿命.

# 类推到MySQL中, SQL语句写法为: select year, avg(lifeExp) as 别名 from df group by year;

df.groupby('year')['lifeExp'].mean()  # 细节: 分组字段会作为 索引列

# 场景2: 分组字段 => 1个, 聚合字段 => 2个

# 需求2: 每一年的平均人口和平均GDP.

df.groupby('year')[['pop', 'gdpPercap']].mean()

# 场景3: 分组字段 => 2个, 聚合字段 => 3个

# 需求3: 统计每年, 每个大洲的 平均预期寿命, 平均人口, 平均GDP.

df.groupby(['year', 'continent'])[['lifeExp', 'pop', 'gdpPercap']].mean()

# 需求4: 统计每个大洲列出了多少个国家和地区.

# 理解1: 一共有多少个大洲, 多少个国家 共计参与了多少次.  即: 总次数.

# 类推SQL写法:  select continent, count(country) from df group by continent;

df.groupby('continent')['country'].value_counts()  # value_counts() 每个值出现了多少次

# 理解2: 每个大洲, 有多少个国家参与.   不同的大洲, 国家 => 总数.

# 类推SQL写法:  select continent, count(distinct country) from df group by continent;

df.groupby('continent')['country'].nunique()  # nunique() 去重统计, 根据洲分组, 根据国家去重统计.

# 扩展, 明天详细讲, 今天先看看, 能掌握最好.

# 需求5: 统计每年的 平均预期寿命, 最大的总人口, 最小的GDP

# 类推SQL写法: select year, avg(lifeExp), max(pop), min(gdpPercap) from df group by year;

# pandas写法: df对象.groupby([分组的列名1, 分组的列名2...]).aggregate({'要被聚合操作的字段1':'聚合函数名', '字段2':'聚合函数名'...})

# 语法糖, df对象.groupby([分组的列名1, 分组的列名2...]).agg({'要被聚合操作的字段1':'聚合函数名', '字段2':'聚合函数名'...})

df.groupby('year').agg({'lifeExp': 'mean', 'pop': 'max', 'gdpPercap': 'min'})
df.groupby('year').aggregate({'lifeExp': 'mean', 'pop': 'max', 'gdpPercap': 'min'})

3. Pandas基本绘图

# 需求: 绘制每年, 平均预期寿命的折线图.

# 1. 计算每年的平均预期寿命.

# data = df.groupby('year')['lifeExp'].mean()

data = df.groupby('year').lifeExp.mean()  # 语法糖, 效果同上
data

# 2. 绘制折线图.

data.plot()  # 语法糖, 默认是: 折线图    

# data.plot.line()  # 折线图    

# data.plot.bar()   # 柱状图

# data.plot.pie()   # 饼图

# 4. 和Pandas数分相关的常用统计值

# 1. 读取数据, 获取df对象

# movie = pd.read_csv('data/movie.csv', index_col='movie_title')

movie = pd.read_csv('data/movie.csv')
movie.head()

# 2. 查看和数据分析相关的统计值.

movie.shape  # 维度: (4916, 28) => (行数, 列数)

movie.info()  # 基本信息
movie.describe()  # 统计信息
movie.describe().T  # 统计信息, 行列转置

movie.describe(include='all')  # 统计信息, 所有字段
movie.describe(include='object')  # 统计信息, 字符串类型的列的信息
movie.describe(include=object)    # 语法糖写法, 效果同上

5. 常用的排序函数

# 1. 加载数据, 获取df对象.

movie = pd.read_csv('data/movie.csv')
movie.head()

5.1 找到 小成本 高口碑的电影

# 查看所有的列.

movie.columns

# 1. 从movie这个df对象中, 找到我们要用的列的信息. 

movie_df = movie[['movie_title', 'imdb_score', 'budget']]
movie_df.head()

# 2. 找到 高口碑(评分最高的前100部电影)

# movie_df.sort_values('imdb_score', ascending=False).head(100)

tmp_df = movie_df.nlargest(100, 'imdb_score')        # 效果同上.
tmp_df

# 3. 在高口碑的数据基础上, 找到 成品最低的那 10 部电影.

# tmp_df.sort_values('budget').head(10)        # ascending默认是True, 升序

tmp_df.nsmallest(10, 'budget')      # 效果同上.

# 4. 上述代码, 一行搞定.

movie[['movie_title', 'imdb_score', 'budget']].nlargest(100, 'imdb_score').nsmallest(10, 'budget')

5.2 找到每年 imdb评分最高的电影.

# 类推 SQL写法 select year, movie_title,  max(imdb_score) from df group by year, movie_title;  + 窗口函数

# 1. 获取到我们要处理的数据集.

movie_df = movie[['title_year', 'movie_title', 'imdb_score']]       # 电影名, 评分, 年费
movie_df.head()

# 2. 按照年排序, 降序.

movie_df.sort_values('title_year', ascending=False)

# 3. 按照年, 评分 降序排序.

tmp_df = movie_df.sort_values(['title_year', 'imdb_score'], ascending=False)
tmp_df

# 4. 基于上述的临时数据, 按照 年份去重, 保留第1份即可. 

# subset参数: 参考哪一列进行去重. 

tmp_df.drop_duplicates(subset='title_year')       

# 5. 一行代码搞定. 

# 完整代码

movie[['title_year', 'imdb_score', 'movie_title']].sort_values(['title_year', 'imdb_score'], ascending=[False, False]).drop_duplicates(subset='title_year')

# 语法糖

movie[['title_year', 'imdb_score', 'movie_title']].sort_values(['title_year', 'imdb_score'], ascending=False).drop_duplicates('title_year')

5.3 提取每年, 每种电影分级中 预算少的电影.

# 合并版.

# 1. 找到我们要用的字段

movie[['title_year', 'content_rating', 'movie_title', 'budget']]

# 2. 根据 年, 分级 降序排列,  根据预算 升序排列.

movie[['title_year', 'content_rating', 'movie_title', 'budget']].sort_values(['title_year', 'content_rating', 'budget'], ascending=[False, False, True])

# 3. 基于上述的数据, 按照 年, 分级 去重, 保留第1个数据即可.

movie[['title_year', 'content_rating', 'movie_title', 'budget']].sort_values(['title_year', 'content_rating', 'budget'], ascending=[False, False, True]).drop_duplicates(['title_year', 'content_rating'])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vision Transformer (ViT)、Swin Transformer 和 Focal Transformer

1. Vision Transformer (ViT) Vision Transformer详解-CSDN博客https://blog.csdn.net/qq_37541097/article/details/118242600?ops_request_misc%257B%2522request%255Fid%2522%253A%2522F8BBAFBF-A4A1-4D38-9C0F-9A43B56AF6DB%2522%252C%2522scm%2522%253A%252220140713.13…

互联网全景消息(5)之RocketMq快速入门(下)

一、RocketMQ的存储设计 1.1 Domain Model 1.1.1 Message Message是RocketMQ消息引擎中的主体。messageId是全局唯一的。MessageKey是业务系统(生产者)生成的,所以如果要结合业务,可以使用MessageKey作为业务系统的唯一索引。 1.1.2 Topic subTopics==Message Queue,其实…

机器学习——Stacking

Stacking: 方法:训练多个模型(可以是强模型),然后将这些模型的预测结果作为新的特征,输入到下一层新的模型(可以是多个)中进行训练,从而得到最终的预测结果。 代表:Stacking本身并没…

跨游戏引擎的H5渲染解决方案(腾讯)

本文是腾讯的一篇H5 跨引擎解决方案的精炼。 介绍 本文通过实现基于精简版的HTML5(HyperText Mark Language 5)来屏蔽不同引擎,平台底层的差异。 好处: 采用H5的开发方式,可以将开发和运营分离,运营部门自…

新峰商城之订单(一):确认页面开发

新峰商城订单从生成到处理结束,主要以下几个流程: (1)提交订单(商城用户发起) (2)订单入库(后台逻辑) (3)支付订单(商城…

人生小满胜万全

大家好,这里是大话硬件。 最近大家都在讨论房贷利率的问题,昨天晚上看到很多群里在发要降息的小道消息,但是今天早上看到央行发了通告不降息。 下午又在群里看到这个买房对比的截图。对于没买房的人来说,肯定在想,还好当时没有买啊。对于买了房的人来说,可能有些人也在想…

「漏洞复现」灵当CRM marketing/index.php SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

Isaac Sim 跑Slam学习过程2024.9.20

# 本文随着时间逐渐增加内容,是学习笔记 # 诶怎么今天Isaac Sim 4.2.0 突然出现了,这哪来的时间再去试试新的.... 没有大佬带...自己学吧 希望使用仿真环境跑定位Slam,现在IMU在Isaac Sim中有现成的传感器模块,GPS则没有&am…

电商ISV 电商SaaS 是什么

Independent Software Vendors的英文缩写,意为“独立软件开发商” 软件即服务(SaaS) 指一种基于云技术的软件交付模式 订阅收费 这些公司叫做ISV软件供应商,通过SaaS服务交付收费 为什么会有电商ISV 从商家角度划分:有独立品牌商家、大商…

MySQL篇(SQL优化)(持续更新迭代)

目录 一、插入数据:Insert 1. 优化方案一:批量插入数据 2. 优化方案二:手动控制事务 3. 优化方案三:主键顺序插入,性能要高于乱序插入 4. 大批量插入数据 5. 案例 5.1. 创建表结构 5.2. 设置参数 5.3. load加载…

计算机毕业设计 基于Python的校园个人闲置物品换购平台 闲置物品交易平台 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具,使用 wireshark 工具抓包分析,是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接…

macOS 中搭建 Flutter 开发环境

如果你的 Mac 是 Apple silicon 处理器,那么有些 Flutter 组件就需要通过 Rosetta 2 来转换适配(详情)。要在 Apple silicon 处理器上运行所有 Flutter 组件,请运行以下指令来安装 Rosetta 2。 sudo softwareupdate --install-ro…

低代码可视化工具-uniapp页面跳转传参-代码生成器

uniapp页面跳转传参 在uni-app中,页面间的跳转和传参是一个常见的需求。uni-app提供了多种页面跳转方式,如uni.navigateTo、uni.redirectTo、uni.reLaunch、uni.switchTab、uni.navigateBack等,每种方式适用于不同的场景。以 页面跳转并传参…

【笔记】第三节 组织与性能

3.1 基本成分 3.2 微观组织特征 0.6-0.8C%碳素钢的组织为珠光体和少量的铁素体。 如何把组织和性能联系起来?德国克虏伯公司的研究——珠光体片间距与渗碳体片层厚度成比例: t s 0 ( ρ 15 ( C % ) − 1 ) ts_0(\frac{\rho}{15(C\%)}-1) ts0​(15(C%)…

【EtherCAT】CiA402简介

目录 1、CiA402是CANopen协议的子协议 2、CiA402是 用于驱动和运动控制的CANopen设备配置文件 3、 CiA402主要由三部分组成 4、CiA介绍 4.1、操作模式 4.2、对象字典 5、一般对象字定义 6、详细对象字定义 7、Profile position mode 8、Homing mode 9、 Position co…

【Unity踩坑】UI Image的fillAmount不起作用

在游戏场景中,我们经常在界面上展示进度条,当然有各种形状的,线性的,长方形的,圆形,环形等等。 Unity中实现这种效果的话,最基本的方法说是改变Image的fillAmout属性。 如果你是初次使用UI Ima…

如何安装1Panel面板并架设一个静态网站

我们通常要架设网站在vps上,就要用到面板,一般是宝塔,但这个面板收费项目较多,用着不太方便。相比宝塔面板,1panel面板是国内功能强大、操作简单、免费易学的Linux服务器管理面板。我们还可以使用一键代码来安装这个面…

新手教学系列——基于统一页面的管理后台设计(二)集成篇

在现代企业级应用中,后台管理系统不仅是业务运营的核心,还承担着数据管理、用户权限控制等重要功能。随着业务规模的不断扩大,系统架构逐渐向微服务转变,多个后端服务模块协同工作,如何高效地集成这些模块,确保系统的稳定性和可维护性,成为开发者亟需解决的问题。在《新…

网络丢包定位记录(一)

数据在Internet上是以数据包为单位传输的,单位为字节,数据在网络上传输,受网络设备,网络质量等原因的影响,使得接收到的数据少于发送出去的数据,造成丢包。 数据包接收、发送原理 发送数据包: …