Pandas 数组/标量/数据类型参考手册(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据科学与数据分析领域,Pandas 是 Python 中最强大的数据处理库之一。无论是处理表格数据、时间序列,还是进行复杂的统计分析,开发者都需要深刻理解其核心概念:数组、标量和数据类型。本文将系统性地解析这三个概念,通过实际案例和代码示例,帮助读者构建清晰的知识框架,并掌握如何高效利用这些特性优化数据处理流程。
一、Pandas 数组:数据的容器与结构
1.1 什么是 Pandas 数组?
在 Pandas 中,数组通常指 Series(一维数组)和 DataFrame(二维表格数组)。它们是 Pandas 的核心数据结构,用于存储和操作数据。
- Series 类似于 Excel 的单列数据,例如学生成绩表中的“数学成绩”列。
- DataFrame 则是多个 Series 的集合,相当于 Excel 的完整表格,包含行和列。
比喻:可以将 DataFrame 想象为“数据仓库”,而 Series 是仓库中的“货架”,每个货架存储特定类型的数据。
import pandas as pd
scores = pd.Series([85, 90, 78, 92], index=["Alice", "Bob", "Charlie", "David"])
print(scores) # 输出:索引与数值的对应关系
data = {
"Name": ["Alice", "Bob", "Charlie", "David"],
"Age": [25, 28, 22, 30],
"Salary": [50000, 60000, 45000, 70000]
}
df = pd.DataFrame(data)
print(df)
1.2 数组的基本操作
数组的常见操作包括索引、切片、筛选和计算。例如:
selected_columns = df[["Name", "Salary"]]
filtered_rows = df[df["Age"] > 25]
average_age = df["Age"].mean()
二、数据类型:Pandas 的底层逻辑
2.1 数据类型的分类
Pandas 中的数据类型(Dtype)决定了数据的存储方式和计算效率。常见的类型包括:
| 类型名称 | 描述 | 示例 |
|------------------|----------------------------------------------------------------------|--------------------------|
| int64
| 整数类型,64 位存储空间 | 100, -5 |
| float64
| 浮点数类型,支持小数 | 3.14, -0.5 |
| object
| 字符串或其他 Python 对象 | "Hello", [1, 2] |
| datetime64
| 时间戳类型,存储日期和时间 | "2023-09-01 14:30:00" |
| category
| 分类类型,用于存储有限数量的离散值 | "Male", "Female" |
比喻:数据类型如同“数据护照”,它告诉 Pandas 如何存储和处理每个值,例如整数和字符串的计算规则完全不同。
2.2 数据类型的重要性
数据类型的正确选择直接影响内存使用和计算速度。例如:
- 使用
int32
而非int64
可以减少内存占用(每个元素从 8 字节降至 4 字节)。 - 对于分类数据(如性别、省份),使用
category
类型可显著加速排序和分组操作。
print(df.dtypes)
df["Age"] = df["Age"].astype("int32")
2.3 自动类型推断与问题排查
Pandas 在读取数据时会自动推断列类型,但有时会出错。例如,包含缺失值的整数列可能被推断为 float64
(因为 NaN 是浮点值)。
df["Salary"] = pd.to_numeric(df["Salary"], errors="coerce") # 转换失败时设为 NaN
三、标量类型:单个数据的表示
3.1 标量与数组的关系
标量(Scalar)是单个值,例如数字、字符串或布尔值,而数组是标量的集合。在 Pandas 中,标量常用于:
- 数据筛选的条件(如
df[df["Age"] > 30]
)。 - 填充缺失值(如
df.fillna(0)
)。
3.2 特殊标量:NaN 和 NaT
- NaN(Not a Number)表示数值型缺失值。
- NaT(Not a Time)表示日期时间型缺失值。
print(pd.isnull(df["Age"])) # 返回布尔数组,标记缺失值位置
df["Age"].fillna(25, inplace=True) # 用整数 25 填充缺失值
3.3 标量与数组的运算
标量与数组的运算会自动广播(Broadcasting),即标量与数组中的每个元素进行操作。
df["Salary"] = df["Salary"] * 1.10
四、数据类型转换与优化
4.1 显式类型转换
通过 astype()
方法强制转换数据类型,需注意兼容性:
df["Date"] = pd.to_datetime(df["Date"])
df["Gender"] = df["Gender"].astype("str")
4.2 数据类型优化技巧
- 内存优化:使用
category
类型代替object
。 - 计算效率:优先使用原生 Pandas 方法而非 Python 循环。
df["City"] = df["City"].astype("category")
五、常见问题与解决方案
5.1 类型错误:混合类型列
当一列同时包含数值和字符串时,Pandas 会将其推断为 object
类型,导致计算失败。
解决方法:
numeric_values = df["Mixed_Column"].apply(lambda x: isinstance(x, (int, float)))
df["Clean_Column"] = df["Mixed_Column"][numeric_values].astype("float64")
5.2 处理日期时间数据
日期格式的统一化是关键:
df["Order_Date"] = pd.to_datetime(df["Order_Date"], format="%Y-%m-%d")
df["Year"] = df["Order_Date"].dt.year
df["Month"] = df["Order_Date"].dt.month
六、结论
Pandas 数组/标量/数据类型参考手册 是数据处理的核心工具箱。通过理解数组结构、数据类型的底层逻辑,以及标量的灵活应用,开发者可以更高效地完成数据清洗、分析和可视化任务。本文提供的代码示例和优化技巧,旨在帮助读者在实际项目中快速解决常见问题,并为进阶学习打下坚实基础。
关键词布局提示(仅作参考,实际文章中自然融入):
- 在标题、小标题、表格、代码注释和结论段落中合理嵌入“Pandas 数组/标量/数据类型参考手册”关键词。
- 通过解释数据类型转换、数组操作等场景,间接强化主题关键词的关联性。