当前位置: 首页 > news >正文

Pandas核心数据结构详解

在数据分析的世界里,有一个工具几乎是绕不开的 —— 那就是 Pandas。无论是数据清洗、转换,还是统计分析、可视化前的数据准备,Pandas 都以其强大的功能和简洁的语法,成为了数据从业者的 “瑞士军刀”。而 Pandas 的强大,很大程度上源于其设计精妙的核心数据结构。今天,我们就来深入剖析 Pandas 中最核心的两种数据结构 ——SeriesDataFrame

一、Pandas 是什么?

Pandas 是基于 NumPy 的一个开源 Python 库,诞生于 2008 年,由 Wes McKinney 开发。它专为解决数据分析任务而设计,提供了高效、灵活且易于使用的数据结构,让我们能够轻松处理结构化数据(如表格数据、时间序列数据等)。

Pandas 的名字来源于 “Panel Data”(面板数据),这是经济学中用于描述多维结构化数据的术语,也暗示了它在处理复杂数据方面的能力。

二、核心数据结构:Series 与 DataFrame

Pandas 的强大之处,首先体现在它的两个核心数据结构上 ——SeriesDataFrame。这两种结构为数据处理提供了坚实的基础,能够应对从简单到复杂的各种数据场景。

1. Series:一维带标签数组

Series 是 Pandas 中最基本的数据结构之一,它本质上是一个一维数组,但与普通 NumPy 数组的最大区别在于,它自带一个标签索引。这个索引可以是整数、字符串、时间戳等,极大地增强了数据访问和操作的灵活性。

(1)Series 的构成

一个 Series 由两部分组成:

  • values:存储实际的数据,通常是一个 NumPy 数组。
  • index:存储数据的标签,是一个 Index 对象。

我们可以通过values和index属性来访问这两部分:

import pandas as pdimport numpy as nps = pd.Series([10, 20, 30, 40, 50])print("数据值:", s.values) # 输出:[10 20 30 40 50]print("索引:", s.index) # 输出:RangeIndex(start=0, stop=5, step=1)
(2)创建 Series 的多种方式

除了从列表创建,Series 还支持多种创建方式:

  • 指定索引创建
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])# 输出:# a 10# b 20# c 30# dtype: int64
  • 从字典创建:字典的键会自动成为索引,值成为数据:
data = {'苹果': 5, '香蕉': 3, '橙子': 4}s = pd.Series(data)# 输出:# 苹果 5# 香蕉 3# 橙子 4# dtype: int64
  • 从标量值创建:需要指定索引长度,所有索引对应的值都为该标量:
s = pd.Series(10, index=['x', 'y', 'z'])# 输出:# x 10# y 10# z 10# dtype: int64
(3)Series 的索引与切片

Series 的索引操作非常灵活,既可以通过位置索引(类似列表),也可以通过标签索引:

  • 标签索引:使用[]或loc[]
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])print(s['b']) # 输出:20print(s.loc['b']) # 输出:20(推荐使用loc,更清晰)
  • 位置索引:使用iloc[]
print(s.iloc[1]) # 输出:20(第2个元素,从0开始)
  • 切片操作
# 标签切片(包含终点)print(s.loc['a':'c']) # 输出a、b、c对应的值# 位置切片(不包含终点)print(s.iloc[0:2]) # 输出第0、1个元素
(4)Series 的运算与缺失值处理

Series 支持向量运算,无需循环即可对每个元素进行操作:

s = pd.Series([1, 2, 3, 4])print(s + 10) # 每个元素加10print(s * 2) # 每个元素乘2print(s > 2) # 布尔判断,返回布尔型Series

对于缺失值(NaN),Pandas 提供了便捷的处理方法:

s = pd.Series([1, np.nan, 3, np.nan])print(s.dropna()) # 删除缺失值print(s.fillna(0)) # 用0填充缺失值print(s.isna()) # 判断是否为缺失值(返回布尔型Series)

2. DataFrame:二维表格型数据结构

DataFrame 是 Pandas 中最核心、最常用的数据结构,它类似于 Excel 表格、SQL 表或 R 中的 data.frame,是一个二维标签数据结构,由行和列组成,每列可以是不同的数据类型(数值、字符串、布尔值等)。

(1)DataFrame 的构成

DataFrame 可以理解为 “Series 的字典”,即每个列是一个 Series,所有列共享同一个行索引。其结构包括:

  • index:行标签(索引)
  • columns:列标签(列名)
  • values:二维数据数组(NumPy 数组或类似结构)
data = {'姓名': ['张三', '李四', '王五'],'年龄': [25, 30, 35],'城市': ['北京', '上海', '广州']}df = pd.DataFrame(data)print("行索引:", df.index)print("列索引:", df.columns)print("数据值:\n", df.values)
(2)创建 DataFrame 的多种方式
  • 从字典创建:最常用的方式,字典的键为列名,值为列表或 Series:
data = {'A': [1, 2, 3],'B': ['a', 'b', 'c'],'C': [True, False, True]}df = pd.DataFrame(data)
  • 从列表嵌套列表创建:需要指定列名:
data = [[1, 'a', True],[2, 'b', False],[3, 'c', True]]df = pd.DataFrame(data, columns=['A', 'B', 'C'])
  • 从 CSV/Excel 文件创建:实际工作中最常用的方式:
df = pd.read_csv('data.csv') # 从CSV文件读取df = pd.read_excel('data.xlsx') # 从Excel文件读取
    • 从 Series 创建:多个 Series 组成 DataFrame(共享索引):
s1 = pd.Series([1, 2, 3], name='A')s2 = pd.Series(['a', 'b', 'c'], name='B')df = pd.DataFrame({s1.name: s1, s2.name: s2})
(3)DataFrame 的索引与数据访问

DataFrame 的索引操作比 Series 更复杂,因为涉及行和列两个维度:

  • 选择列:通过列名(类似字典)或[]
# 选择单列(返回Series)print(df['姓名'])print(df.姓名) # 简写形式,列名无空格时可用# 选择多列(返回DataFrame)print(df[['姓名', '年龄']])
  • 选择行:使用loc(标签索引)或iloc(位置索引)
# 标签索引行print(df.loc[0]) # 选择第0行(返回Series)print(df.loc[0:1]) # 选择第0-1行(返回DataFrame)# 位置索引行print(df.iloc[0]) # 选择第0行print(df.iloc[0:2, 0:2]) # 选择前2行、前2列(行切片:列切片)
  • 选择单元格
# 标签定位(行标签, 列标签)print(df.loc[0, '姓名']) # 输出:张三# 位置定位(行位置, 列位置)print(df.iloc[0, 0]) # 输出:张三
(4)DataFrame 的基本操作
  • 添加 / 删除列
# 添加新列df['年龄加5'] = df['年龄'] + 5# 删除列df = df.drop('年龄加5', axis=1) # axis=1表示操作列
  • 修改索引与列名
# 修改列名,将冒号左边的数据改成右边的数据df = df.rename(columns={'姓名': '名字', '城市': '所在城市'})# 重置行索引df = df.reset_index(drop=True) # drop=True表示删除原索引
  • 数据排序
# 按列值排序(升序)df_sorted = df.sort_values(by='年龄')# 按列值排序(降序)df_sorted = df.sort_values(by='年龄', ascending=False)# 按索引排序df_sorted = df.sort_index()
  • 缺失值处理
# 检测缺失值(每列的缺失值数量)print(df.isna().sum())# 填充缺失值(用列的均值填充数值列)df['年龄'] = df['年龄'].fillna(df['年龄'].mean())# 删除含有缺失值的行(如果仍有缺失值)df = df.dropna(axis=0) # axis=0表示操作行
(5)DataFrame 的聚合与分组

分组聚合是数据分析中非常重要的操作,Pandas 通过groupby实现:

# 按“城市”分组,计算每个城市的平均年龄# 假设我们有一个包含人员信息的DataFrameimport pandas as pddata = {'城市': ['北京', '北京', '上海', '上海', '广州'],'年龄': [25, 30, 28, 32, 27]df = pd.DataFrame(data)city_age_mean = df.groupby('城市')['年龄'].mean()print(city_age_mean)# 分组后应用多个聚合函数city_age_stats = df.groupby('城市')['年龄'].agg(['mean', 'max', 'min'])print(city_age_stats)

三、总结

Series 和 DataFrame 是 Pandas 的基石,掌握这两种数据结构的特性与操作,是学好 Pandas 的关键。Series 作为一维带标签数组,适合处理单列数据;而 DataFrame 作为二维表格结构,能够轻松应对复杂的结构化数据场景。

无论是数据的创建、索引、切片,还是运算、缺失值处理、分组聚合,Pandas 都提供了简洁高效的方法,让数据处理变得得心应手。后续的数据分析、清洗、转换等操作,都是基于这两种数据结构展开的。

http://www.dtcms.com/a/292951.html

相关文章:

  • 第3章通用的服务可用性治理手段——3.2 重试
  • Kotlin 作用域函数 let 的实现原理
  • 大疆视觉算法面试30问全景精解
  • 基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)
  • Java自动拆箱机制
  • 云祺容灾备份系统阿里云对象存储备份与恢复实操手册
  • List<UserInfo> list = new ArrayList<>();为什么要这样创建数组?
  • 智能文本抽取在法院卷宗管理应用剖析
  • 力扣-139.单词拆分
  • Qt 网络编程如何采用Http进行通信
  • 碳化硅缺陷分类与原因
  • C++的lambda表达式原理
  • 【RK3576】【Android14】MIC开发调试
  • 【iOS】SideTable
  • [学习] 笛卡尔坐标系的任意移动与旋转详解
  • 交叉编译opencv(Cpp)于arm64架构开发板上
  • AI 音频产品开发模板及流程(二)
  • 使用python中的pymysql库,并且转化为数组元组数据
  • 【多任务YOLO】A-YOLOM
  • 字体识别实战:用Python打造智能字体侦探工具
  • for-of和for-in
  • 2025年07月22日Github流行趋势
  • Day20-二叉树基础知识
  • python flusk 监控
  • 行业分类表sql
  • 深入解析 Spark:关键问题与答案汇总
  • 力扣刷题 -- 572.另一颗树的子树
  • 逻辑回归全景解析:从数学本质到工业级优化
  • docker 设置镜像仓库代理
  • 企业微信会议室智能预约实战:从线上预约到无钥匙开门