《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)

news2024/11/18 13:27:00

在这里插入图片描述

文章目录

  • 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 中,applymap 函数是进行数据转换和运算的强大工具,它们提供了一种高效的方法来处理数据集中的元素。

8.1.1 基础知识

  1. apply 函数: 可以在 DataFrame 的轴(行或列)上应用一个函数,适用于需要访问多个列,或整个行/列的操作。
  2. map 函数: 主要用于 Series,将一个函数映射到 Series 的每个元素上,适用于元素级的转换和运算。
  3. 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()))

通过这些案例,我们展示了如何使用 applymap 函数进行数据清洗和转换。这些函数为处理复杂的数据转换提供了灵活而强大的方法,使得数据预处理变得更加高效和简洁。

在这里插入图片描述


8.2 性能优化技巧

在处理大型数据集时,性能成为一个不可忽视的因素。优化数据处理性能不仅可以节省时间,还能提高数据分析的效率。

8.2.1 基础知识

  1. 向量化操作: 利用 Pandas 和 NumPy 的向量化操作代替循环,可以显著提高执行速度。
  2. 使用更高效的数据类型: 比如将浮点数列转换为整数类型(如果可能),使用分类类型等,可以减少内存使用。
  3. 批处理处理大数据: 分批次处理数据而不是一次性加载整个数据集到内存中。
  4. 并行处理: 在可能的情况下,利用多核 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 基础知识

  1. 分块处理: 将大型数据集分成小块,逐块加载处理,而不是一次性加载整个数据集到内存中。
  2. 高效的数据格式: 使用如 Parquet、HDF5 等高效的数据存储格式,可以加速数据读写操作,并降低内存使用。
  3. 使用 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 进行超大数据集的分析。这些技巧对于处理和分析大规模数据集至关重要,可以帮助你克服内存限制,提高数据处理效率。

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

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

相关文章

Echarts+Vue 首页大屏静态示例Demo 第三版

效果图: 源码: <template><div class="content bg" style="height: 100vh;overflow-y: auto" :class="{ fullscreen-container: isFullScreen }"><div class="reaDiv" style="height: 10vh"><div…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“…

国产飞腾ARM+FPGA电力行业 DCS 联合解决方案

联合解决方案概述 在火电的发展过程中&#xff0c;随着社会对电力资源需求越来越高&#xff0c;以往较为粗放式的发电已经行不通了&#xff0c;需要 更精细化的发电&#xff0c;以达到资源的最大利用。而这种控制都需要靠自动化技术来实现&#xff0c;单纯的人工是达不到这种 …

从第一性原理看大模型Agent技术

引 一个乐观主义者的悲观估计 随着大规模模型技术的兴起&#xff0c;我们正处于一个崭新的智能时代的黎明。我们有一个大胆的预测&#xff0c;未来的5到10年将可能带来一场大变局&#xff1a;99%的开发、设计和文字工作将被AI接管。这不仅仅是一个想象&#xff0c;而是对未来可…

算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2&#xff08;HJ11 - HJ20&#xff09; HJ11 数字颠倒 描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0&#xff0c;如输入为100&#xff0c;则输出为0…

政安晨的AI笔记——示例演绎OpenAI的ChatGPT与DALL·E提示词总原则(并融合创作一副敦煌飞天仙女图)

ChatGPT是由OpenAI开发的一种基于大规模预训练的语言生成模型。它建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的基础上&#xff0c;通过大量的无监督学习和生成式任务训练来学习语言的概念和模式。 ChatGPT的原理是基于Transformer模型。Transfo…

java处理ppt方案详解

需求 需要系统中展示的ppt案例有一个动态展示的效果&#xff0c;也就是要有动画的交互&#xff0c;要求支持浏览器直接打开预览 背景 目前已经实现了前端上传pptx文件&#xff0c;后端解析为png的图片&#xff0c;前端掉接口返回对应的图片&#xff0c;模拟播放ppt的效果 各种尝…

Kafka_03_Consumer详解

Kafka_03_Consumer详解 Consumer消费消息订阅/拉取ConsumerRecord 消费位移位移提交位移消费 实现原理RebalanceConsumerInterceptorDeSerializer 多线程消费消费线程处理线程 Consumer Consumer(消费者): 从Partition拉取并消费消息(非线程安全) Topic的Partition在每个消费…

最新!2024顶级SCI优化!TTAO-CNN-BiGRU-MSA三角拓扑聚合优化、双向GRU融合注意力的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 TTOA三角聚合优化算法&#xff0c;将在2024年3月正式发表在中科院1区顶级SCI期刊《Expert Systems with Applications》上。 该算法提出时间极短&#xff0c;目前以及近期内不会有套用这个算法的文献。新年伊始&#xff0c;尽快拿下…

备战蓝桥杯---数据结构与STL应用(入门1)

话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a;显然&#xff0c;我们要先合并最小的两堆&#xff08;因为他们在后边也得被计算&#xff0c;换句话&#xff0c;我们独立的看&#xff0c;某一堆的体力值为他自己重量*从现在到最后的次数&#xff09; 因此&a…

JAVA Web 学习(三)Web服务架构

五、软件架构模式——MVC MVC是一种 分层开发的模式 &#xff0c;其中&#xff1a;M-Model&#xff0c;业务模型&#xff0c;处理业务&#xff1b;V&#xff1a;View&#xff0c;视图&#xff0c;界面展示&#xff1b;C&#xff1a;Controller&#xff0c;控制器&#xff0c;处…

vulhub靶机activemq环境下的CVE-2015-5254(ActiveMQ 反序列化漏洞)

影响范围 Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象&#xff0c;利用该漏洞执行任意代码。 漏洞搭建 没有特殊要求&#xff0c;请看 (3条消息) vulhub搭建方法_himobrinehacken的博客-CSD…

柔性电流探头方向判断有哪些方法?干货分享!

柔性电流探头方向判断的方法干货分享&#xff01;从理论到实践&#xff0c;助您成为专业人士&#xff01;干货收藏&#xff0c;快看起来吧&#xff01;      柔性电流探头方向判断一直是电力行业测试中的关键问题之一&#xff0c;确切地判断电流方向对于测试电力系统的稳定…

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别 目录 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现G…

jsp 产品维修管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 产品维修管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

追觅科技发布全折叠高速吹风机Pocket

2月2日&#xff0c;追觅科技召开2024新品发布会&#xff0c;一系列年度新品亮相。现场&#xff0c;追觅科技发布了个护重磅新品——追觅Pocket折叠高速吹风机&#xff0c;这也是行业首个全折叠高速吹风机。 创新柔性折叠技术&#xff0c;直卷吹一机全能 追觅Pocket折叠高速吹风…

体育馆运动场地预定小程序的独特优势与用户体验

随着人们健康意识的提高&#xff0c;体育馆成为了大家进行锻炼和运动的重要场所。为了更好地满足用户的需求&#xff0c;体育馆需要开发一款预定场地的小程序&#xff0c;为用户提供便捷、高效的预定服务。本文将介绍如何使用乔拓云平台开发体育馆运动场地预定小程序&#xff0…

如何评价 Linux 中国停止运营?

如何评价 Linux 中国停止运营&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

MySQL之谈谈MySQL里的日志

文章目录 前言一、SQL是如何做更新操作的二、MySQL中的redo log三、MySQL中的binlog四、聊聊两阶段提交总结 前言 上一章我们讲了一条SQL是如何做查询的&#xff0c;其中经历了许多步骤。这次来讲讲一条SQL是如何做更新操作的。 常有大佬说他可以把MySQL恢复到半个月内任意一秒…

逸学区块链【solidity】真随机数

参考Get a Random Number | Chainlink Documentation 但是很贵&#xff0c;价格 Gas Price&#xff1a;当前gas价格&#xff0c;根据网络状况而波动。Callback gas &#xff1a;返回您所请求的随机值时&#xff0c;回调请求消耗的gas 量。验证gas &#xff1a;量gas 用于验证…