Python Pandas轻松处理大规模类别数据

news/2024/9/19 8:15:36/ 标签: python, pandas, 开发语言

大家好,在数据分析中,类别数据(Categorical Data)是一种常见的数据类型。它表示有限数量的离散值,例如产品类别、性别、国家等。与数值数据不同,类别数据并不代表连续的数值,而是离散的分类信息。处理类别数据是数据预处理的重要环节之一,特别是在进行统计分析或机器学习时。

Pandas提供了专门的工具来处理和优化类别数据,能够有效减少内存占用并提升计算效率。本文将介绍如何使用Pandas处理类别数据,展示类别数据的创建、操作和转换,并通过实际代码示例帮助掌握这些技巧。

1.创建类别数据

在Pandas中,类别数据可以通过 pd.Categorical() 函数创建,也可以直接在 DataFrame 中转换已有的列为类别类型。

1.1 手动创建类别数据

python">import pandas as pd# 手动创建类别数据
categories = pd.Categorical(['男', '女', '女', '男', '男'])
print(categories)

输出结果:

python">[男, 女, 女, 男, 男]
Categories (2, object): [男, 女]

在这个示例中,pd.Categorical() 将一个性别列表转换为类别数据。Pandas自动识别了其中的两个类别:

1.2 将DataFrame中的列转换为类别类型

如果已经有一个数据框,其中某些列包含类别信息,可以使用 astype('category') 方法将这些列转换为类别数据类型。

python"># 创建示例数据框
data = {'姓名': ['张三', '李四', '王五', '赵六'],'性别': ['男', '女', '男', '女'],'城市': ['北京', '上海', '广州', '北京']
}df = pd.DataFrame(data)# 将性别和城市列转换为类别数据类型
df['性别'] = df['性别'].astype('category')
df['城市'] = df['城市'].astype('category')print(df.dtypes)

输出结果:

python">姓名       object
性别     category
城市     category
dtype: object

通过 astype('category'),将 性别城市 列转换为了类别类型,节省内存并提高了性能。

2.操作类别数据

一旦将列转换为类别数据类型,Pandas提供了一些专门的方法来操作这些类别数据。

2.1 查看类别

可以通过 categories 属性查看类别数据的所有类别。

python"># 查看类别
print(df['性别'].cat.categories)

输出结果:

python">Index(['女', '男'], dtype='object')

2.2 增加和删除类别

类别数据的类别值是可以动态调整的。可以使用 add_categories() 方法增加新的类别,使用 remove_categories() 删除类别。

增加类别

python"># 增加新的类别
df['性别'] = df['性别'].cat.add_categories(['未知'])
print(df['性别'].cat.categories)

输出结果:

python">Index(['女', '男', '未知'], dtype='object')

删除类别

python"># 删除某个类别
df['性别'] = df['性别'].cat.remove_categories(['未知'])
print(df['性别'].cat.categories)

输出结果:

python">Index(['女', '男'], dtype='object')

2.3 类别数据的排序

类别数据可以是有序的,特别是在某些场景下,类别值具有一定的顺序关系。例如,教育水平(小学、初中、高中、大学)或客户等级(银、金、钻石)。可以在创建类别数据时指定类别的顺序,或者使用 ordered=True 参数来设定有序类别。

python"># 创建有序的教育水平类别
education_levels = pd.Categorical(['小学', '高中', '大学', '初中', '高中'],categories=['小学', '初中', '高中', '大学'],ordered=True
)print(education_levels)

输出结果:

python">[小学, 高中, 大学, 初中, 高中]
Categories (4, object): [小学 < 初中 < 高中 < 大学]

在这个示例中,创建了一个有序的类别数据,Pandas将 小学初中高中大学 按照指定顺序排列。

有序类别数据可以进行比较操作,Pandas会根据指定的顺序进行比较。

python"># 比较教育水平
print(education_levels > '初中')

输出结果:

python">[False  True  True False  True]

通过这种方式,Pandas可以根据类别的顺序进行逻辑判断,这是处理有序类别数据的一个重要功能。

3.类别数据的内存优化

类别数据的主要优势之一就是能够显著减少内存的占用,尤其是对于含有大量重复值的列。

python"># 创建一个包含大量重复值的DataFrame
import numpy as npN = 100000
data = {'城市': np.random.choice(['北京', '上海', '广州', '深圳'], size=N),'性别': np.random.choice(['男', '女'], size=N)
}df_normal = pd.DataFrame(data)
df_category = df_normal.copy()# 将城市和性别列转换为类别数据类型
df_category['城市'] = df_category['城市'].astype('category')
df_category['性别'] = df_category['性别'].astype('category')# 比较内存占用
print("普通数据框内存占用:")
print(df_normal.memory_usage(deep=True))print("\n类别数据框内存占用:")
print(df_category.memory_usage(deep=True))

输出结果示例:

python">普通数据框内存占用:
Index        128
城市     8000100
性别     8000100
dtype: int64类别数据框内存占用:
Index        128
城市      404128
性别      404128
dtype: int64

从结果可以看出,类别数据的内存占用远低于普通的字符串类型。在大规模数据集上,使用类别数据可以显著减少内存使用,提高数据处理的效率。

4.将类别数据转换为虚拟变量

在进行机器学习时,类别数据通常需要转换为虚拟变量(one-hot encoding),以便模型能够处理这些数据。Pandas提供了 get_dummies() 函数,可以轻松实现这一转换。

python"># 对城市和性别列进行one-hot编码
df_dummies = pd.get_dummies(df_category, columns=['城市', '性别'])
print(df_dummies.head())

输出结果:

python">   城市_上海  城市_北京  城市_广州  城市_深圳  性别_女  性别_男
0      0      1      0      0     0     1
1      1      0      0      0     1     0
2      0      0      1      0     1     0
3      0      0      0      1     1     0
4      1      0      0      0     0     1

通过 get_dummies() 函数,我们可以将类别数据转换为虚拟变量,使其适用于机器学习模型。

综上所述,在数据分析中,类别数据是一类常见且重要的数据类型,通常表示有限的离散值。Python的Pandas库为处理类别数据提供了强大的支持。通过将列转换为类别数据类型,Pandas不仅可以显著减少内存使用,还能提高数据处理的性能。本文介绍了如何创建和操作类别数据,涵盖了类别数据的增删、排序以及有序类别的处理,同时还探讨如何通过one-hot编码将类别数据转换为适合机器学习的格式。在大规模数据处理中,合理使用Pandas的类别数据功能,可以大幅提升数据处理效率,特别是在数据预处理和特征工程中尤为关键。


http://www.ppmy.cn/news/1526339.html

相关文章

在Flask中实现日志记录

在Flask中实现日志记录是一个关键的功能&#xff0c;它有助于监控应用的运行情况、调试问题以及记录重要的运行信息。以下是在Flask中实现日志记录的详细步骤和最佳实践&#xff1a; 一、使用Python内置的logging模块 Flask应用通常会使用Python的logging模块来进行日志记录。…

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)

一、场景二&#xff1a;一个项目由多个人负责接口测试&#xff0c;我只负责其中三个模块&#xff0c;协同 1.什么是测试片段&#xff1f; 1&#xff09;就相当于只是项目的一部分用例&#xff0c;不能单独运行&#xff0c;必须要和控制器&#xff08;include,模块&#xff09;一…

Neo4j入门案例:西游记

创建一个基于《西游记》中“孙悟空”的黑神话版本的知识图谱。这个图谱将会包括《西游记》中的一些主要角色、地点、事件以及它们之间的关系。我们将创建至少10个节点和20个关系&#xff0c;并提供相应的Cypher语句。 数据模型定义 实体类型&#xff08;节点&#xff09; 角色…

java中如何计算两个list的差集,并集,交集等,举一个详细的实例说明,用stream流的filter,contains等去实现。

在Java中&#xff0c;可以使用Java 8引入的Stream API来优雅地计算两个列表的交集、并集和差集。下面是使用Stream流的filter、contains等方法来实现这些集合运算的一个详细示例。 示例类定义 首先&#xff0c;我们定义一个简单的Person类来作为我们的数据模型&#xff1a; j…

Apache SeaTunnel Zeta 引擎源码解析(二) Client端的任务提交流程

作者&#xff1a;刘乃杰 编辑整理&#xff1a;曾辉 引入 本系列文章是基于 Apache SeaTunnel 2.3.6版本&#xff0c;围绕Zeta引擎给大家介绍其任务是如何从提交到运行的全流程&#xff0c;希望通过这篇文档&#xff0c;对刚刚上手SeaTunnel的朋友提供一些帮助。 我们整体的文…

VBA学习(75):电子发票管理小助手/电子发票信息读取

“电子发票管理助手”设计过程与思路 1、定义一个过程 ReadInvoiceFile Sub ReadInvoiceFile()On Error Resume NextDim FileExtn As StringDim iRow As IntegerInvoiceCode ""InvoiceNo ""SellerName ""SellerTaxID ""Amount …

初识Linux · 进程(4)

目录 前言&#xff1a; 进程的状态 直接谈论进程的状态 僵尸进程和孤儿进程 纯理论部分 运行态&#xff1a; 阻塞态&#xff1a; 挂起态&#xff1a; 进程的优先级以及切换问题 切换&#xff1a; 优先级&#xff1a; 前言&#xff1a; 承接上文&#xff0c;进程1到…

Laravel接口中实现WebSocket服务消息发送PHP中使用socket扩展搭建WebSocket服务

要在Laravel接口中实现WebSocket服务消息发送&#xff0c;你可以使用Laravel的Pusher库。首先&#xff0c;你需要安装Pusher库&#xff1a; composer require pusher/pusher-php-server然后&#xff0c;在你的Laravel项目中创建一个WebSocket事件类&#xff0c;例如WebSocketE…

【30天玩转python】装饰器与闭包

装饰器与闭包 装饰器和闭包是 Python 中非常强大的特性。理解它们不仅有助于写出更简洁和模块化的代码&#xff0c;还能极大地提高代码的复用性和灵活性。本节将详细介绍装饰器与闭包的概念、用法及其在实际编程中的应用。 1. 闭包 闭包&#xff08;Closure&#xff09;是指一…

Linux之ansible的playbook剧本(yaml文件)

playbook剧本 一个剧本&#xff08;即playbook&#xff09;&#xff0c;可以包含多个play 每个play用于在指定的主机上&#xff0c;通过模块和参数执行相应的任务 每个play可以包含多个任务。 任务有模块和参数构成。 paly要建立在ansible文件夹下才能使用 因为yaml文件对格式…

精简实用!一分钟搭建文件管理服务!

大家好&#xff0c;我是 Java陈序员。 今天&#xff0c;给大家介绍一款精简实用的文件托管服务&#xff0c;一分钟即可搭建使用&#xff01; 关注微信公众号&#xff1a;【Java陈序员】&#xff0c;获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 Du…

Linux 入门:简单的基础操作

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言Linux 入门&#xff1a;从基础操作到 WSL2 安装文章有误敬请斧正 不胜感恩&#xff01;1. 什么是 Linux&#xff1f;2. Linux 和其他系统有啥不同&#xff1f;3. Linux 的主要组成4. 常见 Linux 发行版5. 基本…

【深度学习】搞懂卷积神经网络(一)

卷积神经网络是一种具有局部连接&#xff0c;权重共享等特性的深层前馈神经网络。一般是由卷积层&#xff0c;池化层&#xff0c;全连接层交叉堆叠而成&#xff0c;使用反向传播算法进行训练。卷积神经网络具有一定程度上的平移&#xff0c;缩放和旋转不变性&#xff0c;较前馈…

k8s 中的 Service 简介

前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址&#xff0c;那么是不是有 IP 了&#xff0c;访问起来就简单了呢&#xff0c;其实不然。 因为在 k8s 中 Pod 不是持久性的&#xff0c;摧毁重建将获得新的 IP&#xff0c;客户端通过会变更 IP 来访问显然不合理。另外 Pod 还经…

每天五分钟深度学习PyTorch:不同的神经网络层设置不同的学习率

本文重点 我们前面学习了基本网络模型的搭建,获取网络模型的子结构,以及优化器optim,我们发现我们设置优化器的时候,是对整个模型设置的,也就是说整个模型的参数学习率是一样,本节课程我们学习如何给不同的网络层设置不同的学习率。主要还是通过优化器optim来实现的,本…

Radware 报告 Web DDoS 攻击活动

新一代 HTTPS 洪水攻击的频率和强度急剧增加&#xff0c;攻击者引入的复杂程度也在迅速提高。2024 年上半年&#xff0c;Web 分布式拒绝服务 (DDoS) 攻击的频率和强度显著增加。其中很大一部分活动可以归因于受政治紧张局势驱使的黑客活动分子。 众所周知&#xff0c;当今的黑…

Python中匹配HTML标签时<.*>和<.*?>有什么区别

在讨论Python中匹配HTML标签时使用的正则表达式<.*>与<.*?>的区别&#xff0c;实际上是在讨论正则表达式中的贪婪模式&#xff08;Greedy Mode&#xff09;与非贪婪模式&#xff08;Non-Greedy Mode&#xff09;或懒惰模式&#xff08;Lazy Mode&#xff09;之间的…

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADCDMA采样时&#xff0c;遇到了一些小坑记录一下&#xff1b; 一、ADCDMA采样时进入死循环&#xff1b; 解决方法&#xff1a;ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高&#xff0c;且增大ADCHAL_ADC_Start_DMA(&ha…

git 命令---想要更改远程仓库

在 Git 中&#xff0c;origin 是默认的远程仓库名称。可以使用以下命令查看当前 Git 仓库的 origin 名称及其对应的 URL&#xff1a; git remote -v这个命令会列出所有配置的远程仓库及其名称&#xff0c;其中 origin 通常是克隆时自动设置的默认远程仓库名称。输出示例&#…

堆排序,快速排序

目录 1.堆排序 2.快速排序 1.hoare版本 2.挖坑法 3.前后指针法 注意点 1.堆排序 void Swap(int* a, int* b) {int tmp *a;*a *b;*b tmp; } void adjustdown(int* a, int n, int parent) {int child parent * 2 1;while (child < n){if (child 1 < n &&am…