Pandas核心数据结构详解

发布于:2025-07-23 ⋅ 阅读:(21) ⋅ 点赞:(0)

在数据分析的世界里,有一个工具几乎是绕不开的 —— 那就是 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 pd

import numpy as np

s = 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']) # 输出:20

print(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) # 每个元素加10

print(s * 2) # 每个元素乘2

print(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实现:
 

# 按“城市”分组,计算每个城市的平均年龄

# 假设我们有一个包含人员信息的DataFrame

import pandas as pd

data = {

'城市': ['北京', '北京', '上海', '上海', '广州'],

'年龄': [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 都提供了简洁高效的方法,让数据处理变得得心应手。后续的数据分析、清洗、转换等操作,都是基于这两种数据结构展开的。


网站公告

今日签到

点亮在社区的每一天
去签到