《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)
文章目录
- 8.1 使用 apply 和 map 函数
- 8.1.1 基础知识
- 8.1.2 重点案例:客户数据清洗和转换
- 8.1.3 拓展案例一:产品评分调整
- 8.1.4 拓展案例二:地址格式化
- 8.2 性能优化技巧
- 8.2.1 基础知识
- 8.2.2 重点案例:大型销售数据分析
- 8.2.3 拓展案例一:内存优化通过更高效的数据类型
- 8.2.4 拓展案例二:使用并行处理加速数据清洗
- 8.3 处理大型数据集
- 8.3.1 基础知识
- 8.3.2 重点案例:分块读取并处理销售数据
- 8.3.3 拓展案例一:使用高效数据格式存储和读取
- 8.3.4 拓展案例二:利用 Dask 处理超大数据集
8.1 使用 apply 和 map 函数
在 Pandas 中,apply
和 map
函数是进行数据转换和运算的强大工具,它们提供了一种高效的方法来处理数据集中的元素。
8.1.1 基础知识
- apply 函数: 可以在 DataFrame 的轴(行或列)上应用一个函数,适用于需要访问多个列,或整个行/列的操作。
- map 函数: 主要用于 Series,将一个函数映射到 Series 的每个元素上,适用于元素级的转换和运算。
- applymap 函数: 在 DataFrame 的每个元素上应用一个函数,适用于元素级的操作,是
map
函数在 DataFrame 上的对应操作。
8.1.2 重点案例:客户数据清洗和转换
假设你有一份包含客户信息的数据集,需要进行数据清洗和转换。
数据准备
import pandas as pd# 示例客户数据
customer_data = {'name': ['Alice Smith', 'bob Johnson', 'CHARLIE BROWN'],'age': ['25', 'thirty-five', '40'],'email': ['alice@example.com', 'BOB@example.com', 'charlie@example.net']
}
customer_df = pd.DataFrame(customer_data)
数据清洗和转换
# 标准化姓名格式:首字母大写,其他字母小写
customer_df['name'] = customer_df['name'].apply(lambda x: x.title())# 转换年龄为数值类型:将非数字的年龄转换为 NaN,然后填充平均年龄
customer_df['age'] = pd.to_numeric(customer_df['age'], errors='coerce').fillna(customer_df['age'].dropna().astype(int).mean())# 邮箱地址转小写
customer_df['email'] = customer_df['email'].map(lambda x: x.lower())
8.1.3 拓展案例一:产品评分调整
有一份包含产品评分的数据集,需要对评分进行一定的调整。
数据准备
# 示例产品评分数据
product_scores = {'product_id': [1, 2, 3],'score': [4, 3.5, 5]
}
scores_df = pd.DataFrame(product_scores)
评分调整
# 对评分加权调整:评分低于5的乘以1.1,但不超过5
scores_df['adjusted_score'] = scores_df['score'].apply(lambda x: min(x * 1.1, 5))
8.1.4 拓展案例二:地址格式化
假设有一份包含客户地址的数据集,需要将地址格式统一化,去除多余的空格和标点。
数据准备
# 示例客户地址数据
address_data = {'customer_id': [1, 2, 3],'address': ['123 Elm St.', ' 456 Maple Ave', '789 Oak Dr, ']
}
address_df = pd.DataFrame(address_data)
地址格式化
# 去除地址中的标点和多余空格
import re
address_df['address'] = address_df['address'].apply(lambda x: re.sub(r'[^\w\s]', '', x.strip()))
通过这些案例,我们展示了如何使用 apply
和 map
函数进行数据清洗和转换。这些函数为处理复杂的数据转换提供了灵活而强大的方法,使得数据预处理变得更加高效和简洁。
8.2 性能优化技巧
在处理大型数据集时,性能成为一个不可忽视的因素。优化数据处理性能不仅可以节省时间,还能提高数据分析的效率。
8.2.1 基础知识
- 向量化操作: 利用 Pandas 和 NumPy 的向量化操作代替循环,可以显著提高执行速度。
- 使用更高效的数据类型: 比如将浮点数列转换为整数类型(如果可能),使用分类类型等,可以减少内存使用。
- 批处理处理大数据: 分批次处理数据而不是一次性加载整个数据集到内存中。
- 并行处理: 在可能的情况下,利用多核 CPU 进行并行处理。
8.2.2 重点案例:大型销售数据分析
假设你有一份非常大的销售数据集,需要计算每个产品的总销售额。
数据准备
import pandas as pd
import numpy as np# 生成大型销售数据示例
np.random.seed(0)
sales_data = {'product_id': np.random.randint(1, 100, 1000000),'sales_amount': np.random.rand(1000000) * 100
}
sales_df = pd.DataFrame(sales_data)
性能优化
# 向量化计算总销售额
total_sales = sales_df.groupby('product_id')['sales_amount'].sum()
8.2.3 拓展案例一:内存优化通过更高效的数据类型
处理包含数百万条记录的客户数据集,需要将数据类型转换为更高效的格式以减少内存使用。
数据准备
# 生成大型客户数据示例
customer_data = {'customer_id': np.arange(1, 1000001),'age': np.random.randint(18, 80, 1000000),'email_count': np.random.randint(1, 10, 1000000)
}
customer_df = pd.DataFrame(customer_data)
内存优化
# 转换数据类型
customer_df['customer_id'] = customer_df['customer_id'].astype('int32')
customer_df['age'] = customer_df['age'].astype('int8')
customer_df['email_count'] = customer_df['email_count'].astype('int8')
8.2.4 拓展案例二:使用并行处理加速数据清洗
假设需要对一份大型文本数据集进行清洗,包括去除特殊字符、转换大小写等。
数据准备
# 生成大型文本数据示例
text_data = ['This is a SAMPLE text.' * 10 for _ in range(100000)]
text_df = pd.DataFrame(text_data, columns=['text'])
并行处理
由于 Pandas 直接不支持并行处理,此示例暂略。在实际应用中,可以考虑使用 dask
库或 multiprocessing
库来实现数据的并行处理。
通过这些案例,我们展示了如何通过向量化操作、优化数据类型、批处理处理大数据以及并行处理等技巧来提高数据处理的性能。这些方法对于处理大型数据集尤其重要,可以帮助你在保证分析质量的同时,显著减少处理时间和内存消耗。
8.3 处理大型数据集
处理大型数据集时,传统的数据处理方法可能会受到内存限制的影响,导致效率低下或无法执行。优化数据处理流程,使其能够高效地处理大型数据集,是提高分析效率的关键。
8.3.1 基础知识
- 分块处理: 将大型数据集分成小块,逐块加载处理,而不是一次性加载整个数据集到内存中。
- 高效的数据格式: 使用如 Parquet、HDF5 等高效的数据存储格式,可以加速数据读写操作,并降低内存使用。
- 使用 Dask 等工具: 对于特别大的数据集,可以使用如 Dask 这样的库,它支持并行计算并优化内存使用。
8.3.2 重点案例:分块读取并处理销售数据
假设你有一个非常大的销售记录文件,无法一次性加载到内存中,需要分块进行处理。
数据准备
此处我们模拟创建一个大型文件的过程,实际操作中你可能直接操作现有的大文件。
import pandas as pd
import numpy as np# 生成示例销售数据并保存到 CSV 文件
chunk_size = 10000
num_chunks = 500
for i in range(num_chunks):df = pd.DataFrame({'SaleID': range(i * chunk_size, (i + 1) * chunk_size),'ProductID': np.random.randint(1, 100, chunk_size),'SaleAmount': np.random.rand(chunk_size) * 100})df.to_csv('/mnt/data/sales_large.csv', mode='a', index=False, header=(i == 0))
分块读取和处理
chunk_iter = pd.read_csv('/mnt/data/sales_large.csv', chunksize=chunk_size)total_sales = 0
for chunk in chunk_iter:total_sales += chunk['SaleAmount'].sum()
print(f"Total sales amount: {total_sales}")
8.3.3 拓展案例一:使用高效数据格式存储和读取
将大型数据集转换为更高效的格式,如 Parquet,以优化读写速度和降低内存消耗。
# 假设 df 是一个大型 DataFrame
df.to_parquet('/mnt/data/sales_large.parquet')# 读取 Parquet 文件
df_parquet = pd.read_parquet('/mnt/data/sales_large.parquet')
8.3.4 拓展案例二:利用 Dask 处理超大数据集
对于超大型数据集,Pandas 可能不足以高效处理。此时可以考虑使用 Dask。
# 注意:此代码示例需要在支持 Dask 的环境中运行
from dask import dataframe as dd# 读取数据
dask_df = dd.read_csv('/mnt/data/sales_large.csv')# 使用 Dask 进行计算
total_sales_dask = dask_df['SaleAmount'].sum().compute()
print(f"Total sales amount with Dask: {total_sales_dask}")
通过这些案例,我们展示了如何处理大型数据集,包括分块处理数据、使用高效的数据格式,以及利用 Dask 进行超大数据集的分析。这些技巧对于处理和分析大规模数据集至关重要,可以帮助你克服内存限制,提高数据处理效率。
相关文章:

《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)
文章目录 8.1 使用 apply 和 map 函数8.1.1 基础知识8.1.2 重点案例:客户数据清洗和转换8.1.3 拓展案例一:产品评分调整8.1.4 拓展案例二:地址格式化 8.2 性能优化技巧8.2.1 基础知识8.2.2 重点案例:大型销售数据分析8.2.3 拓展案…...

计算机网络_1.6.2 计算机网络体系结构分层的必要性
1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源: B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题?以…...

跟着cherno手搓游戏引擎【18】抽象Shader、项目小修改
抽象: Shader.h: #pragma once #include <string>namespace YOTO {class Shader {public:virtual~Shader()default;virtual void Bind()const0;virtual void UnBind()const0;static Shader* Create(const std::string& vertexSrc, const std::string&am…...
每日OJ题_算法_模拟②_力扣495. 提莫攻击
目录 力扣495. 提莫攻击 解析代码 力扣495. 提莫攻击 495. 提莫攻击 难度 简单 在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。 当提莫攻击艾希,…...

freertos 源码分析二 list链表源码
list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…...
Peter算法小课堂—Dijkstra最短路算法
大家好,我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦,hia~hia~hia。今天,我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法?长文警告⚠ 正经点啊 手算样例 大家思考一下,你在手算样例的时候&am…...
Python 读取和写入包含中文的csv、xlsx、json文件
背景 最近在做数据的训练,经常需要读取写入csv、xlsx、json文件来获取数据,在这里做简单总结记录。 ps: 读取和写入中文文件时,需要确保文件的编码格式是正确的。通常情况使用UTF-8编码格式。如果使用其他编码格式可能会导致读取或写入时出…...

【算法】利用递归dfs解决二叉树算法题(C++)
文章目录 1. 前言2. 算法题2331.计算布尔二叉树的值129.求根节点到叶节点数字之和LCR047.二叉树剪枝98.验证二叉搜索树230.二叉搜索树中第K小的元素257.二叉树的所有路径 1. 前言 有关 递归 的相关解释与解题 请看下文: 以汉诺塔理解递归、并用递归解决算法题 对于…...

计算机网络_1.6.1 常见的三种计算机网络体系结构
1.6.1 常见的三种计算机网络体系结构 1、OSI(七层协议)标准失败的原因2、TCP/IP参考模型3、三种网络体系结构对比 笔记来源: B站 《深入浅出计算机网络》课程 1、OSI(七层协议)标准失败的原因 (1…...

XML传参方式
export function groupLoginAPI(xmlData) {return http.post(/tis/group/1.0/login, xmlData, {headers: {Content-Type: application/xml,X-Requested-With: AAServer/4.0,}}) }import {groupLoginAPI} from "../api/user"; function (e) { //xml格式传参let groupX…...

Pyecharts炫酷散点图构建指南【第50篇—python:炫酷散点图】
文章目录 Pyecharts炫酷散点图构建指南引言安装Pyecharts基础散点图自定义散点图样式渐变散点图动态散点图高级标注散点图多系列散点图3D散点图时间轴散点图笛卡尔坐标系下的极坐标系散点图 总结: Pyecharts炫酷散点图构建指南 引言 在数据可视化领域,…...

关于爬取所有哔哩哔哩、任意图片、所有音乐、的python脚本语言-Edge浏览器插件 全是干货!
这些都是现成的并且实时更新的!从次解放双手! 首先有自己的edge浏览器基本上都有并且找到插件选项 1.哔哩哔哩视频下载助手(爬取哔哩哔哩视频) bilibili哔哩哔哩视频下载助手 - Microsoft Edge Addons 下面是效果: 2.图…...

压力测试工具-Jmeter使用总结
目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…...
[cmake]CMake Error: Could not create named generator Visual Studio 16 2019解决方法
配置flycv时,cmake以下代码会报错第二行的错误,网上解决方法为第三行代码 cmake .. -G "Visual Studio 16 2019 Win64" CMake Error: Could not create named generator Visual Studio 16 2019 cmake .. -G "Visual Studio 16 2019"…...

2024美赛数学建模D题思路分析 - 大湖区水资源问题
1 赛题 问题D:大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域,其中包含了这两个国家的许多大城市地区,气候和局部天气条件不同。 这些湖泊的水被用于许多用途࿰…...

2024 高级前端面试题之 HTTP模块 「精选篇」
该内容主要整理关于 HTTP模块 的相关面试题,其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTTP模块精选篇 1. HTTP 报文的组成部分2. 常见状态码3. 从输入URL到呈现页面过程3.1 简洁3.2 详细 4. TCP、UDP相关5. HTTP2相关6. https相关7. WebSocket的…...

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
Python爬虫存储库安装
如果你还没有安装好MySQL、MongoDB、Redis 数据库,请参考这篇文章进行安装: Windows、Linux、Mac数据库的安装(mysql、MongoDB、Redis)-CSDN博客 存储库的安装 上节中,我们介绍了几个数据库的安装方式,但…...
用函数求最小公倍数和最大公约数(c++题解)
题目描述 输入两个正整数m和n,求其最大公约数和最小公倍数。 提示,求最大公约数用一个函数实现。本题求最大公约数必须用高效算法,如辗转相除法,朴素算法要超时。 输入格式 第1行:两个非整数,值在0&…...

鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
鲜花销售小程序目录 目录 基于微信小程序的鲜花销售系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、前台功能模块 2、后台功能模块 (1) 后台登录 (2) 管理员功能模块 用户管理 商家管理 鲜花信息管理 鲜花分类管理 管理员管理 系统管理 (3) 商家功…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...