Pandas 的数据类型都有哪些? `category` 类型是什么?

news/2025/11/25 12:40:52/文章来源:https://www.cnblogs.com/wangya216/p/19267915

我们来系统地梳理一下 Pandas 的数据类型,并重点讲解 category 类型。这是一个非常重要的知识点,也是 Pandas 能高效处理大数据集的关键原因之一。

这篇文章会分为以下几个部分:

  1. Pandas 数据类型概览:列出并简要介绍 Pandas 支持的主要数据类型。
  2. 核心数值类型详解:深入探讨 intfloat 类型,包括 nullable 类型。
  3. 核心字符串类型详解:重点讲解 objectstring 类型的区别与应用。
  4. category 类型深度解析:这是本文的重点,包括其原理、优势、适用场景、创建方法以及注意事项。
  5. 其他常用数据类型:介绍 datetime64, timedelta64, bool 等。
  6. 数据类型的转换与检查:如何查看和转换数据类型。
  7. 总结与最佳实践

1. Pandas 数据类型概览

Pandas 构建在 NumPy 之上,因此它的数据类型与 NumPy 紧密相关,但又进行了扩展,以支持更丰富的数据形式(如字符串、日期时间和分类数据)。

主要的数据类型可以分为以下几类:

  • 数值类型 (Numeric)

    • int64 / int32 / int16 / int8: 有符号整数。
    • uint64 / uint32 / uint16 / uint8: 无符号整数。
    • float64 / float32: 浮点数。
    • Int64 / Float64: Pandas 特定的 nullable 整数和浮点数类型(支持缺失值 pd.NA)。
  • 字符串类型 (String)

    • object: 通用类型,可存储字符串、Python 对象等。
    • string: Pandas 1.0+ 引入的专门字符串类型。
  • 分类类型 (Categorical)

    • category: 用于存储具有固定数量的离散值的数据。
  • 日期时间类型 (Datetime/Timedelta)

    • datetime64[ns]: 日期时间类型。
    • timedelta64[ns]: 时间差类型。
  • 布尔类型 (Boolean)

    • bool: 布尔类型(True/False)。
    • boolean: Pandas 特定的 nullable 布尔类型。

选择正确的数据类型对于优化内存占用和提升计算性能至关重要。

2. 核心数值类型详解

数值类型是数据分析中最常用的类型。

  • int vs float:

    • int 用于存储没有小数部分的整数。
    • float 用于存储有小数部分的数字或科学记数法表示的数字。
    • 内存占用: int64float64 各占 8 个字节。可以通过选择更小的类型(如 int32float32)来节省内存,前提是数据范围允许。
    import pandas as pd
    import numpy as nps_int64 = pd.Series([1, 2, 3], dtype='int64')
    s_int32 = pd.Series([1, 2, 3], dtype='int32')print(f"int64 内存占用: {s_int64.memory_usage(deep=True)} bytes") # 通常约为 72 bytes (索引+数据)
    print(f"int32 内存占用: {s_int32.memory_usage(deep=True)} bytes") # 通常约为 56 bytes
    
  • Nullable 数值类型 (Int64, Float64):

    • 标准的 int64float64 类型无法表示缺失值(会自动向上转换为 float64 并用 np.nan 表示)。
    • Pandas 的 Int64 (注意大写 I) 和 Float64 类型专门支持缺失值 pd.NA,同时保持整数或浮点数的特性。
    s_with_na = pd.Series([1, None, 3], dtype='Int64')
    print(s_with_na)
    # 0       1
    # 1    <NA>
    # 2       3
    # dtype: Int64
    

3. 核心字符串类型详解

处理文本数据时,我们主要使用两种类型:objectstring

  • object 类型:

    • 特点: 这是 Pandas 中最通用的数据类型。一个 object 类型的 Series 可以包含任意 Python 对象,包括字符串、整数、字典等。当 Series 中包含字符串时,Pandas 默认使用 object 类型。
    • 优点: 非常灵活,没有限制。
    • 缺点:
      • 性能差: 对 object 类型的操作通常是逐元素的 Python 循环,比基于 NumPy 的向量化操作慢得多。
      • 内存占用大: 每个字符串在 Python 中都是一个独立的对象,有额外的内存开销。
      • 功能有限: 缺乏专门针对字符串的内置方法(需要使用 .str 访问器,这本质上还是在循环)。
  • string 类型 (Pandas 1.0+):

    • 特点: 这是 Pandas 为字符串数据引入的专用类型。它在内部有更高效的存储方式,并提供了更丰富、更快速的字符串处理方法。
    • 优点:
      • 性能更好: 许多字符串操作都经过了优化,速度远超 object 类型。
      • 功能更丰富: 提供了更全面的字符串处理方法,且语法更简洁(部分方法无需 .str)。
      • 明确的类型语义: 清晰地表明这一列存储的就是字符串。
      • 支持缺失值: 可以原生支持 pd.NA 缺失值。
    • 使用:
    s_str_obj = pd.Series(['apple', 'banana', 'cherry'])
    s_str_spec = pd.Series(['apple', 'banana', 'cherry'], dtype='string')print(f"s_str_obj dtype: {s_str_obj.dtype}") # object
    print(f"s_str_spec dtype: {s_str_spec.dtype}") # string# 更丰富的方法
    print(s_str_spec.str.contains('a')) # 仍然可以使用 .str 访问器
    # 0     True
    # 1     True
    # 2    False
    # dtype: boolean
    
    • 建议: 当一列数据明确是字符串且需要进行大量文本处理时,强烈建议使用 string 类型。

4. category 类型深度解析

category 类型是 Pandas 中一个非常强大但常常被低估的特性。它专为处理分类数据(Categorical Data)而设计。

什么是分类数据?

分类数据是指其取值范围是有限的、离散的。例如:

  • 性别:男、女
  • 学历:小学、中学、大学、研究生
  • 评分:优秀、良好、及格、不及格
  • 国家/地区:中国、美国、英国、日本...

category 类型的核心原理

category 类型通过一种“字典编码”的方式来存储数据,从而实现内存优化:

  1. 提取唯一值:从数据中提取出所有不重复的类别(Categories),并赋予它们一个唯一的整数编码(Code)。
  2. 存储编码:实际在内存中存储的不是原始的字符串或值,而是它们对应的整数编码。
  3. 保留映射关系:同时保留一个从“编码”到“原始类别”的映射关系(categories 属性)。

举例说明:
原始数据:["男", "女", "男", "男", "女"]

  • object 类型存储: ["男", "女", "男", "男", "女"] (每个字符串都是一个对象)
  • category 类型存储:
    • 编码 (Codes): [0, 1, 0, 0, 1]
    • 类别 (Categories): Index(['男', '女'], dtype='object')

category 类型的优势

  1. 极大地节省内存

    • 这是最主要的优势。存储整数编码比存储重复的长字符串要高效得多。数据中重复度越高,节省的内存就越多。对于有上百万行的数据集,效果非常显著。
    • 示例: 一个包含 100 万条记录的 object 类型 Series(存储城市名)可能占用几十 MB,而转换为 category 类型后可能只占用几 MB。
  2. 显著提升性能

    • 计算速度更快: 基于整数编码的操作(如分组、排序、合并、逻辑判断)比基于字符串的操作快得多。
    • 减少磁盘 I/O: 更小的数据体积意味着读写文件(如 CSV, Parquet)时速度更快。
  3. 提供更有意义的语义

    • 明确地告诉 Pandas 和其他开发者,这一列是分类数据,具有固定的取值范围。
    • 可以防止输入无效的类别值(默认情况下)。

如何创建 category 类型数据?

  • 在创建时指定 dtype='category':
s = pd.Series(['red', 'blue', 'red', 'green', 'blue'], dtype='category')
print(s)
# 0      red
# 1     blue
# 2      red
# 3    green
# 4     blue
# dtype: category
# Categories (3, object): ['blue', 'green', 'red']
  • 使用 .astype('category') 进行转换:
s_obj = pd.Series(['red', 'blue', 'red', 'green', 'blue'])
s_cat = s_obj.astype('category')
  • 指定类别顺序 (Ordered Categories):
    默认情况下,类别是无序的。但有时类别有自然顺序(如:低 < 中 < 高)。
s_ord = pd.Series(['low', 'high', 'medium', 'low'], dtype=pd.CategoricalDtype(categories=['low', 'medium', 'high'], ordered=True
))
print(s_ord)
# 0       low
# 1      high
# 2    medium
# 3       low
# dtype: category
# Categories (3, object): ['low' < 'medium' < 'high']# 有序分类支持比较操作
print(s_ord > 'low')
# 0    False
# 1     True
# 2     True
# 3    False
# dtype: boolean

内存占用对比示例

import pandas as pd
import numpy as np# 创建一个包含100万个高重复率字符串的Series
np.random.seed(42)
categories = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']
data_object = np.random.choice(categories, size=1_000_000)s_object = pd.Series(data_object)
s_category = s_object.astype('category')mem_obj = s_object.memory_usage(deep=True) / (1024 * 1024) # MB
mem_cat = s_category.memory_usage(deep=True) / (1024 * 1024) # MBprint(f"Object 类型内存占用: {mem_obj:.2f} MB")
print(f"Category 类型内存占用: {mem_cat:.2f} MB")
print(f"内存节省比例: {((mem_obj - mem_cat) / mem_obj * 100):.1f}%")# 典型输出:
# Object 类型内存占用: 68.66 MB
# Category 类型内存占用: 0.95 MB
# 内存节省比例: 98.6%

这个例子清晰地展示了 category 类型在内存上的巨大优势。

使用 category 类型的注意事项

  1. 适合高重复率数据: 如果一个列的唯一值非常多(例如,唯一ID、姓名),使用 category 类型不仅不能节省内存,反而可能因为存储类别映射表而增加内存开销。
  2. 类别操作的开销: 添加新的类别或修改现有类别可能比在 object 类型上操作更复杂、开销更大,因为它可能需要重新编码。
  3. 并非所有操作都更快: 对于一些简单的逐元素访问,category 类型可能因为需要解码而比 object 类型稍慢。但在涉及分组、聚合等大规模操作时,优势明显。
  4. 与其他库的兼容性: 虽然 Pandas 生态系统内部对 category 类型支持良好,但在与某些外部库或旧版本工具交互时,可能需要先将其转换回 object 类型。

5. 其他常用数据类型

  • datetime64[ns]:

    • 用于存储日期和时间。Pandas 对此类数据提供了强大的处理能力,如日期解析、提取年/月/日、时间差计算等。
    • pd.to_datetime() 是创建此类数据的常用函数。
    s_dt = pd.to_datetime(['2023-01-01', '2023-02-15', '2023-12-31'])
    print(s_dt.dtype) # datetime64[ns]
    
  • timedelta64[ns]:

    • 用于存储时间差。
    s_td = s_dt - pd.to_datetime('2023-01-01')
    print(s_td.dtype) # timedelta64[ns]
    
  • bool / boolean:

    • bool 用于存储 TrueFalse
    • boolean 是 nullable 版本,支持 pd.NA
    s_bool = pd.Series([True, False, None], dtype='boolean')
    

6. 数据类型的转换与检查

  • 检查数据类型:

    • df.dtypes: 查看 DataFrame 中每列的数据类型。
    • s.dtype: 查看 Series 的数据类型。
  • 转换数据类型:

    • s.astype(dtype): 将 Series 转换为指定类型。
    • pd.to_numeric(s, errors='coerce'): 安全地将数据转换为数值类型,无法转换的值设为 NaN
    • pd.to_datetime(s): 将数据转换为日期时间类型。
    • s.astype('category'): 转换为分类类型。

7. 总结与最佳实践

  • 优先使用专用类型: 如用 string 代替 object 存储字符串,用 datetime64 存储日期。
  • 善用 category 类型: 当你确定某列是分类数据且重复率较高时,毫不犹豫地使用 category 类型,可以极大地优化性能和内存。
  • 关注内存占用: 对于大型数据集,检查和优化数据类型是首要的性能优化步骤之一。
  • 注意缺失值: 根据需要选择支持 pd.NA 的 nullable 类型(Int64, Float64, string, boolean)。
  • 了解数据: 选择数据类型的前提是充分了解你的数据内容和业务含义。

希望这篇全面的介绍能帮助你更好地理解和使用 Pandas 的数据类型,特别是强大的 category 类型!

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

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

相关文章

【日记】提前来成都的两项任务都完成了!(2328 字)

正文走得急,头绳忘带了。培训住标间,跟原来的同事一起住,到地方来才想起来还可以打游戏,手柄也没带,血亏。昨天八点的车,到成都东。头天晚上睡得很早,早上六点半就醒了吧,把没吃完放在冰箱里的怡朵面包吃了。差…

2025年热门的弹簧加载呼吸阀公司厂家最新推荐排行榜

2025年热门的弹簧加载呼吸阀公司厂家最新推荐排行榜 行业背景与市场趋势 弹簧加载呼吸阀作为工业安全防护的关键设备,广泛应用于石油化工、制药、食品加工、能源储运等领域。随着国家对安全生产要求的不断提高,以及…

2025年知名的凸轮式转子泵厂家最新推荐排行榜

2025年知名的凸轮式转子泵厂家最新推荐排行榜 行业背景与市场趋势 凸轮式转子泵作为一种高效、稳定的流体输送设备,近年来在食品、制药、化工、环保、新能源等领域的应用持续扩大。根据《2024-2025年中国工业泵行业…

酷呆桌面(Coodesker)V1.1.0.2 免费版下载与安装教程:Windows 桌面整理神器

你是否也曾被塞满文件和快捷方式的电脑桌面搞得心烦意乱?随着时间的推移,桌面变得杂乱无章,不仅影响美观,更降低了查找文件的效率。今天,就为你介绍一款能彻底解决这个烦恼的神器——酷呆桌面(Coodesker),让你…

【LVGL】窗口部件

引言 仅作笔记,无参考价值。 窗口部件(lv_win)窗口部件相关 api 函数示例程序 void my_gui(void) {lv_obj_t *win = lv_win_create(lv_scr_act(), 20); /* 创建窗口部件 */lv_obj_set_size(win, 300, 200); /* 设…

2025年比较好的发光标识标牌厂家最新用户好评榜

2025年比较好的发光标识标牌厂家最新用户好评榜行业背景与市场趋势发光标识标牌行业作为户外广告和商业标识的重要组成部分,近年来随着城市商业发展和品牌形象建设需求增长而持续扩大。根据中国广告协会最新发布的《2…

详细介绍:(huawei)5.最长回文子串

详细介绍:(huawei)5.最长回文子串2025-11-25 12:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

2025年知名的小角度平薄铰链厂家最新TOP实力排行

2025年知名的小角度平薄铰链厂家最新TOP实力排行行业背景与市场趋势随着家居五金行业向高精度、轻量化方向发展,小角度平薄铰链作为高端定制家具的核心部件,市场需求持续增长。据中国五金制品协会2024年数据显示,全…

2025年口碑好的纤维增强水泥抗爆墙厂家最新用户好评榜

2025年口碑好的纤维增强水泥抗爆墙厂家最新用户好评榜行业背景与市场趋势随着工业安全标准的不断提高和建筑防爆需求的日益增长,纤维增强水泥抗爆墙市场迎来了快速发展期。根据中国建筑材料联合会最新发布的《2024-20…

2025年靠谱的切削液厂家最新用户好评榜

2025年靠谱的切削液厂家最新用户好评榜行业背景与市场趋势随着中国制造业的持续升级和智能化转型,金属加工行业迎来了新一轮发展机遇。据中国机床工具工业协会最新数据显示,2024年我国金属加工液市场规模已达185亿元…

2025年评价高的三维超薄铰链厂家最新热销排行

2025年评价高的三维超薄铰链厂家最新热销排行行业背景与市场趋势随着家居五金行业向智能化、轻量化方向发展,三维超薄铰链作为高端定制家具的核心部件,近年来市场需求呈现爆发式增长。根据中国五金制品协会最新发布的…

2025年比较好的百通电缆Fieldbus H1通讯电缆厂家最新TOP实力排行

2025年比较好的百通电缆Fieldbus H1通讯电缆厂家最新TOP实力排行工业通讯电缆市场概况与趋势随着工业4.0和智能制造的深入推进,Fieldbus H1通讯电缆作为工业自动化领域的关键基础设施,市场需求持续增长。据Marketsan…

2025年知名的少儿编程行业推荐榜

2025年知名的少儿编程行业推荐榜开篇:少儿编程行业背景与市场趋势随着人工智能时代的加速到来,少儿编程教育已成为全球教育领域发展最为迅速的细分市场之一。根据中国电子学会最新发布的《2024-2025中国少儿编程教育…

2025年知名的氩弧焊气表最新TOP厂家排名

2025年知名的氩弧焊气表最新TOP厂家排名行业背景与市场趋势氩弧焊气表作为焊接设备中的关键部件,在金属加工、汽车制造、航空航天等领域发挥着不可替代的作用。根据中国焊接协会最新发布的《2024-2025年中国焊接设备市…

2025年11月武汉一对一培训机构推荐榜单及选择指南

随着教育个性化需求的不断增长,武汉地区的一对一培训市场近年来呈现出快速发展的趋势。许多家长和学生开始寻求更加定制化的学习方案,以应对日益激烈的学业竞争。选择一对一培训的家长通常希望为孩子提供更具针对性的…

2025年11月武汉一对一培训机构对比榜:不同需求场景下的选择建议

作为家长,面对孩子学业压力与个性化教育需求,选择一家合适的一对一培训机构常成为难题。武汉教育市场近年来呈现多元化发展趋势,政策规范下行业洗牌加速,家长更关注机构的资质合规性、教学实效性与服务持续性。典型…

2025年评价高的TPE材料行业内口碑厂家排行榜

2025年评价高的TPE材料行业内口碑厂家排行榜行业背景与市场趋势热塑性弹性体(TPE)作为一种环保、可回收的高性能材料,近年来在全球范围内获得了广泛应用。根据MarketsandMarkets最新研究报告显示,2025年全球TPE市场…

2025年知名的上海减压器厂家最新实力排行

2025年知名的上海减压器厂家最新实力排行行业背景与市场趋势随着中国制造业的持续升级和工业气体应用的不断扩展,减压器作为关键的气体控制设备,市场需求呈现稳定增长态势。根据中国工业气体协会最新发布的《2024-20…

2025年比较好的动力配电柜厂家最新推荐权威榜

2025年比较好的动力配电柜厂家最新推荐权威榜行业背景与市场趋势随着我国电力基础设施建设的持续升级和新能源产业的快速发展,动力配电柜作为电力系统的关键设备,市场需求呈现稳定增长态势。据中国电器工业协会最新数…

2025年知名的天鹅绒艺术涂料厂家最新热销排行

2025年知名的天鹅绒艺术涂料厂家最新热销排行行业背景与市场趋势随着中国建筑装饰行业的持续升级和消费者审美需求的不断提高,天鹅绒艺术涂料市场迎来了爆发式增长。据《2024-2025中国建筑涂料行业发展白皮书》显示,…