1. 前言:为什么需要 Pandas 数据结构?
在数据处理和分析中,我们需要高效的方式来存储和操作结构化数据。Python 原生的列表(List)和字典(Dict)虽然灵活,但缺乏针对数据分析的优化。Pandas 提供了两种核心数据结构:
Series
:一维带标签数组(类似增强版列表)DataFrame
:二维表格型数据结构(类似 Excel 表格)
它们支持快速查询、自动对齐、缺失值处理、高效计算等特性,是数据分析的基础。
2. Series:一维带标签数组
2.1 创建 Series
Series 由数据(值) + 索引(标签)组成,可以通过列表、字典或 NumPy 数组创建:
import pandas as pd
import numpy as np
# 从列表创建(默认索引为 0, 1, 2...)
s1 = pd.Series([10, 20, 30, 40])
print(s1)
"""
0 10
1 20
2 30
3 40
dtype: int64
"""
# 从字典创建(键自动变为索引)
s2 = pd.Series({'A': 90, 'B': 80, 'C': 70})
print(s2)
"""
A 90
B 80
C 70
dtype: int64
"""
# 自定义索引
s3 = pd.Series([1.1, 2.2, 3.3], index=['X', 'Y', 'Z'])
print(s3)
"""
X 1.1
Y 2.2
Z 3.3
dtype: float64
"""
2.2 Series 的属性和方法
属性/方法 | 说明 | 示例 |
---|---|---|
s.values |
获取值数组 | s1.values → [10, 20, 30, 40] |
s.index |
获取索引 | s3.index → Index(['X', 'Y', 'Z']) |
s.dtype |
数据类型 | s2.dtype → int64 |
s.shape |
形状 | s1.shape → (4,) |
s.head(n) |
前 n 行 | s1.head(2) → 显示前 2 个值 |
s.isna() |
检查缺失值 | pd.Series([1, None]).isna() → [False, True] |
2.3 Series 的操作
# 向量化运算(自动对齐索引)
s4 = pd.Series([1, 2, 3], index=['A', 'B', 'C'])
s5 = pd.Series([10, 20, 30], index=['B', 'C', 'D'])
print(s4 + s5)
"""
A NaN # A 只在 s4 中存在
B 12.0 # B 在两者中都存在
C 23.0
D NaN # D 只在 s5 中存在
dtype: float64
"""
# 条件筛选
print(s2[s2 > 80]) # 输出大于 80 的值
"""
A 90
dtype: int64
"""
3. DataFrame:二维表格型数据结构
3.1 创建 DataFrame
DataFrame 可以看作多个 Series 的集合,类似于 Excel 表格或 SQL 表:
# 从字典创建(键是列名,值是数据)
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Score': [88.5, 92.0, 78.5]
}
df = pd.DataFrame(data)
print(df)
"""
Name Age Score
0 Alice 25 88.5
1 Bob 30 92.0
2 Charlie 35 78.5
"""
# 从列表创建(需指定列名)
data = [['Apple', 5], ['Banana', 3], ['Orange', 8]]
df2 = pd.DataFrame(data, columns=['Fruit', 'Count'])
print(df2)
"""
Fruit Count
0 Apple 5
1 Banana 3
2 Orange 8
"""
3.2 DataFrame 的属性和方法
属性/方法 | 说明 | 示例 |
---|---|---|
df.columns |
列名 | df.columns → Index(['Name', 'Age', 'Score']) |
df.index |
行索引 | df.index → RangeIndex(start=0, stop=3) |
df.shape |
形状 | df.shape → (3, 3) |
df.dtypes |
每列数据类型 | df.dtypes → Name: object, Age: int64, Score: float64 |
df.head(n) |
前 n 行 | df.head(2) → 显示前 2 行 |
df.describe() |
统计摘要 | df.describe() → 计算均值、标准差等 |
3.3 DataFrame 的操作
(1)选择数据
# 选择列(返回 Series)
print(df['Name']) # 或 df.Name
"""
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
"""
# 选择多列(返回 DataFrame)
print(df[['Name', 'Score']])
# 选择行(使用 loc/iloc)
print(df.loc[1]) # 按标签选择(第 2 行)
print(df.iloc[0:2]) # 按位置选择(前 2 行)
(2)条件筛选
# 筛选 Age > 25 的行
print(df[df['Age'] > 25])
"""
Name Age Score
1 Bob 30 92.0
2 Charlie 35 78.5
"""
# 多条件筛选(使用 & 或 |)
print(df[(df['Age'] > 25) & (df['Score'] > 80)])
(3)增删改列
# 新增列
df['Pass'] = df['Score'] >= 80
print(df)
"""
Name Age Score Pass
0 Alice 25 88.5 True
1 Bob 30 92.0 True
2 Charlie 35 78.5 False
"""
# 为每个学生添加性别信息
df['Gender'] = ['Female', 'Male', 'Male'] # 顺序对应原数据的行
print(df)
"""
Name Age Score Gender
0 Alice 25 88.5 Female
1 Bob 30 92.0 Male
2 Charlie 35 78.5 Male
"""
# 删除列
df.drop('Pass', axis=1, inplace=True) # axis=1 表示列
4. Series vs DataFrame 对比
特性 | Series | DataFrame |
---|---|---|
维度 | 一维 | 二维 |
索引 | 单索引(行) | 行索引 + 列索引 |
数据形式 | 单列数据 | 多列数据(多个 Series 的集合) |
适用场景 | 单一变量分析(如温度序列) | 多变量分析(如学生成绩表) |
5. 总结
Series
:一维数据,适合存储单列数据(如时间序列、传感器数据)。DataFrame
:二维表格,适合处理多列结构化数据(如 CSV、Excel 数据)。两者均支持自动对齐、向量化运算、缺失值处理,是数据分析的核心工具。
练习建议:
创建一个包含学生信息的 DataFrame,并练习增删改查操作。
尝试用 Series 存储某城市一周的温度数据,并计算平均温度。