Pandas 简介 #
什么是数据分析? #
数据分析是将原始数据转化为有价值信息的过程,包括数据收集、清洗、转换、建模和可视化等步骤。好的数据分析能够帮助我们发现数据中的模式、趋势和洞察。
text
┌─────────────────┐
│ 原始数据 │
│ 杂乱无章 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 数据清洗 │
│ Pandas 处理 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 数据分析 │
│ 统计、建模 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 洞察与决策 │
│ 可视化呈现 │
└─────────────────┘
什么是 Pandas? #
Pandas 是 Python 最流行的数据分析库,名字来源于 “Panel Data”(面板数据)。它提供了两种主要的数据结构:Series(一维)和 DataFrame(二维),能够处理大多数数据分析任务。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ Pandas │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Series │ │ DataFrame │ │ Index │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 数据清洗 │ │ 数据分析 │ │ 数据可视化 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
Pandas 的历史 #
发展历程 #
text
2008年 ─── Pandas 诞生
│
│ Wes McKinney 创建
│ AQR Capital Management
│ 解决金融数据分析问题
│
2009年 ─── 开源发布
│
│ GitHub 开源
│ 社区开始贡献
│
2012年 ─── Python 数据分析书籍
│
│ Wes McKinney 著书
│ 推广 Pandas 使用
│
2015年 ─── Pandas 0.17
│
│ 更好的 NumPy 集成
│ 性能优化
│
2018年 ─── Pandas 0.23
│
│ 可空整数类型
│ 改进时间序列
│
2020年 ─── Pandas 1.0
│
│ 正式版发布
│ API 稳定
│
2023年 ─── Pandas 2.0
│
│ Apache Arrow 后端
│ 性能大幅提升
│
至今 ─── 行业标准
│
│ 数据分析必备工具
│ 活跃的社区
里程碑版本 #
| 版本 | 时间 | 重要特性 |
|---|---|---|
| 0.1 | 2008 | 初始发布,核心数据结构 |
| 0.10 | 2012 | 时间序列增强 |
| 0.17 | 2015 | NumPy 集成优化 |
| 0.23 | 2018 | 可空整数类型 |
| 1.0 | 2020 | API 稳定化 |
| 2.0 | 2023 | Arrow 后端、性能提升 |
为什么选择 Pandas? #
传统数据分析的痛点 #
在使用 Pandas 之前,数据分析面临以下问题:
python
# 传统方式:使用 Python 列表和字典
data = [
{'name': 'Alice', 'age': 25, 'city': 'New York'},
{'name': 'Bob', 'age': 30, 'city': 'London'},
{'name': 'Charlie', 'age': 35, 'city': 'Tokyo'}
]
# 计算平均年龄需要手动循环
total_age = 0
for person in data:
total_age += person['age']
average_age = total_age / len(data)
# 筛选数据也很繁琐
filtered = [p for p in data if p['age'] > 25]
Pandas 的解决方案 #
python
import pandas as pd
# 使用 DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'city': ['New York', 'London', 'Tokyo']
})
# 计算平均年龄 - 一行搞定
average_age = df['age'].mean()
# 筛选数据 - 简洁直观
filtered = df[df['age'] > 25]
Pandas 的核心特点 #
1. 强大的数据结构 #
python
import pandas as pd
import numpy as np
# Series - 一维带标签数组
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s)
# DataFrame - 二维表格
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c'],
'C': [1.1, 2.2, 3.3]
})
print(df)
2. 灵活的数据处理 #
python
# 数据清洗
df.dropna() # 删除缺失值
df.fillna(0) # 填充缺失值
df.drop_duplicates() # 删除重复值
# 数据转换
df['new_col'] = df['A'] * 2 # 新增列
df.rename(columns={'A': 'a'}) # 重命名列
# 数据筛选
df[df['A'] > 1] # 条件筛选
df.query('A > 1') # 查询语法
3. 高效的数据分析 #
python
# 描述统计
df.describe() # 统计摘要
df.mean() # 平均值
df.corr() # 相关系数
# 分组聚合
df.groupby('category').sum() # 分组求和
df.pivot_table(...) # 透视表
# 时间序列
df.resample('M').mean() # 月度重采样
df.rolling(7).mean() # 7日滚动平均
4. 丰富的 IO 支持 #
python
# 读取数据
pd.read_csv('data.csv') # CSV
pd.read_excel('data.xlsx') # Excel
pd.read_json('data.json') # JSON
pd.read_sql(query, conn) # SQL 数据库
# 写入数据
df.to_csv('output.csv')
df.to_excel('output.xlsx')
df.to_json('output.json')
df.to_sql('table', conn)
Pandas 与其他工具对比 #
Pandas vs NumPy #
| 特性 | Pandas | NumPy |
|---|---|---|
| 数据结构 | Series、DataFrame | ndarray |
| 标签索引 | ✅ 支持 | ❌ 仅整数索引 |
| 异构数据 | ✅ 支持 | ❌ 同构 |
| 缺失值 | ✅ 原生支持 | ❌ 需要特殊处理 |
| 表格操作 | ✅ 丰富 | ❌ 有限 |
| 性能 | 高 | 极高 |
| 适用场景 | 数据分析 | 数值计算 |
Pandas vs Excel #
| 特性 | Pandas | Excel |
|---|---|---|
| 数据量 | 百万级+ | 有限(约100万行) |
| 自动化 | 完全可编程 | 需要手动操作 |
| 可重复性 | 高 | 低 |
| 复杂计算 | Python 全功能 | 公式有限 |
| 学习曲线 | 中等 | 平缓 |
| 可视化 | 需配合库 | 内置丰富 |
| 版本控制 | Git 友好 | 困难 |
Pandas vs R data.frame #
| 特性 | Pandas | R data.frame |
|---|---|---|
| 语言 | Python | R |
| 生态 | Python 数据科学生态 | R 统计生态 |
| 性能 | 高 | 中等 |
| 语法 | 面向对象 | 函数式 |
| 可视化 | Matplotlib/Seaborn | ggplot2 |
| 机器学习 | Scikit-learn | caret/tidymodels |
Pandas 的应用场景 #
1. 金融分析 #
python
import pandas as pd
# 读取股票数据
df = pd.read_csv('stock_prices.csv', parse_dates=['date'])
# 计算收益率
df['returns'] = df['price'].pct_change()
# 计算移动平均
df['ma_20'] = df['price'].rolling(20).mean()
# 计算波动率
volatility = df['returns'].std() * np.sqrt(252)
2. 数据清洗 #
python
# 处理缺失值
df.dropna(subset=['important_col'])
df.fillna({'col1': 0, 'col2': 'unknown'})
# 处理重复值
df.drop_duplicates()
# 数据类型转换
df['date'] = pd.to_datetime(df['date'])
df['amount'] = df['amount'].astype(float)
3. 商业分析 #
python
# 销售数据分析
sales = pd.read_excel('sales.xlsx')
# 按地区分组
regional_sales = sales.groupby('region')['amount'].sum()
# 月度趋势
monthly = sales.resample('M', on='date')['amount'].sum()
# 产品排名
top_products = sales.groupby('product')['amount'].sum().nlargest(10)
4. 科学研究 #
python
# 实验数据处理
data = pd.read_csv('experiment.csv')
# 描述统计
summary = data.describe()
# 相关性分析
correlation = data.corr()
# 分组比较
grouped = data.groupby('treatment').agg(['mean', 'std'])
Pandas 的核心概念 #
Series(序列) #
python
# 一维带标签数组
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
# 访问元素
s['a'] # 通过标签
s[0] # 通过位置
s['a':'c'] # 切片
DataFrame(数据框) #
python
# 二维表格结构
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30]
})
# 访问数据
df['name'] # 选择列
df.loc[0] # 选择行(标签)
df.iloc[0] # 选择行(位置)
df.loc[0, 'name'] # 选择单元格
Index(索引) #
python
# 行索引
df.index # 行标签
df.columns # 列标签
# 设置索引
df.set_index('id') # 设置某列为索引
df.reset_index() # 重置索引
# 多层索引
df.set_index(['year', 'month'])
Pandas 的设计哲学 #
1. 数据优先 #
python
# 所有操作围绕数据展开
df.head() # 查看数据
df.info() # 数据信息
df.describe() # 数据统计
2. 链式操作 #
python
# 流畅的链式调用
result = (df
.dropna()
.query('age > 18')
.groupby('city')
.agg({'salary': 'mean'})
.sort_values('salary', ascending=False)
)
3. 向量化计算 #
python
# 避免循环,使用向量化操作
df['new_col'] = df['col1'] + df['col2'] # 高效
# 而不是:
# for i in range(len(df)):
# df.loc[i, 'new_col'] = df.loc[i, 'col1'] + df.loc[i, 'col2']
Pandas 的局限性 #
已知限制 #
text
⚠️ 内存限制
- 数据需要全部加载到内存
- 超大数据集需要分块处理
⚠️ 单线程
- 默认单线程执行
- 大数据计算可能较慢
⚠️ 数据类型
- 某些操作会改变数据类型
- 需要注意类型推断
解决方案 #
python
# 大数据处理
df = pd.read_csv('large.csv', chunksize=10000)
for chunk in df:
process(chunk)
# 使用 Dask 扩展
import dask.dataframe as dd
ddf = dd.read_csv('very_large.csv')
# 类型优化
df = df.astype({'col1': 'int32', 'col2': 'category'})
学习路径 #
text
入门阶段
├── Pandas 简介(本文)
├── 安装与配置
└── Series 和 DataFrame 基础
进阶阶段
├── 数据选择与过滤
├── 数据清洗
└── 统计分析
高级阶段
├── 分组聚合
├── 合并连接
└── 时间序列
实战阶段
├── 数据分析项目
├── 性能优化
└── 最佳实践
下一步 #
现在你已经了解了 Pandas 的基本概念,接下来学习 安装与配置,开始实际使用 Pandas!
最后更新:2026-04-04