什么是 Pandas
Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易用的数据结构和数据分析工具。Pandas 的核心数据结构是 DataFrame(二维表格型数据结构)和 Series(一维标签数组),这些数据结构建立在 NumPy 数组之上,但提供了更丰富的数据操作功能。
Pandas 名字来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python 数据分析)的双关语,由 Wes McKinney 于2008年在 AQR Capital Management 工作时开发。最初是为了解决金融数据分析中的实际问题而设计的,后来逐渐发展成为一个通用型的数据分析工具。
Pandas 的主要功能包括:
- 数据清洗:处理缺失值、重复值、异常值等
- 数据转换:排序、过滤、分组、聚合等操作
- 时间序列分析:专门的日期/时间处理功能
- 数据可视化:与 Matplotlib 集成,可直接绘制图表
- 数据输入/输出:支持 CSV、Excel、SQL、JSON 等多种格式
典型应用场景示例:
- 金融分析:计算股票收益率、构建投资组合
- 商业智能:销售数据分析、客户行为分析
- 科学研究:实验数据处理、统计分析
- 网络数据分析:日志处理、用户行为追踪
Pandas 已经成为 Python 数据科学生态系统中的核心组件之一,与 NumPy、Matplotlib、Scikit-learn 等库深度集成,广泛应用于金融、统计、社会科学、工程等领域。其简洁的 API 设计和高效的底层实现(部分用 Cython 优化)使其成为数据科学家和分析师的首选工具。
Pandas 构建在 NumPy 数组结构之上,但提供了更高级的数据操作接口。其主要优势包括:
- 处理表格数据的便捷性
- 内置的数据对齐功能
- 灵活处理缺失数据
- 强大的时间序列功能
- 高性能的合并/连接操作
核心数据结构
1. Series
Series 是 Pandas 中最基本的一维数据结构,类似于带标签的数组:
import pandas as pd
import numpy as np
# 创建Series示例
s = pd.Series([1, 3, 5, np.nan, 6, 8],
index=['a', 'b', 'c', 'd', 'e', 'f'],
name='my_series')
主要特性:
- 每个元素都有索引标签(默认从0开始的整数索引)
- 可以包含不同类型的数据(但通常建议保持类型一致)
- 支持向量化操作(与NumPy数组类似)
- 具有名称属性(name)
- 支持布尔索引和花式索引
- 提供丰富的统计方法(mean(), std(), sum()等)
使用场景:
- 时间序列数据
- 实验测量数据
- 任何需要标签的一维数据
2. DataFrame
DataFrame 是二维表格型数据结构,类似于 Excel 表格或 SQL 表:
# 创建DataFrame示例
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [28, 24, 35, 32],
'City': ['New York', 'Paris', 'Berlin', 'London']}
df = pd.DataFrame(data,
index=['emp1', 'emp2', 'emp3', 'emp4'],
columns=['Name', 'Age', 'City', 'Salary'])
主要特性:
- 由行(index)和列(columns)组成
- 每列可以是不同的数据类型(数值、字符串、日期等)
- 提供强大的数据操作功能(筛选、排序、分组等)
- 支持行列操作
- 可以看作Series的字典
使用场景:
- 结构化数据存储和分析
- 数据清洗和预处理
- 数据可视化前的数据整理
- 机器学习的特征工程
主要功能特性
数据读取和写入
Pandas 支持多种数据格式的读取和写入:
# 读取数据示例
# CSV文件
df = pd.read_csv('data.csv', sep=',', header=0, encoding='utf-8')
# Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# SQL数据库
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM employees', conn)
# 写入数据示例
df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', sheet_name='Results')
支持的其他格式包括:
- JSON
- HTML
- HDF5
- Parquet
- Feather
- Stata
- SAS
- Pickle
数据清洗
常见的数据清洗操作:
# 处理缺失值
df.fillna(value=0) # 用特定值填充缺失值
df.fillna(method='ffill') # 前向填充
df.dropna(how='any') # 删除任何包含缺失值的行
df.dropna(thresh=2) # 保留至少2个非NA值的行
# 数据类型转换
df['column'] = df['column'].astype('float') # 转换为浮点数
df['date'] = pd.to_datetime(df['date']) # 转换为日期时间
# 重复值处理
df.drop_duplicates(subset=['col1', 'col2']) # 基于特定列删除重复值
df.drop_duplicates(keep='last') # 保留最后一次出现的重复值
# 字符串处理
df['name'] = df['name'].str.upper() # 转换为大写
df['email'] = df['email'].str.contains('@') # 检查包含
# 异常值处理
df = df[(df['value'] > lower_bound) & (df['value'] < upper_bound)]
数据筛选和排序
# 条件筛选
df[df['Age'] > 30] # 筛选年龄大于30的记录
df.query('Age > 30 & City == "New York"') # 使用query方法
# 多条件筛选
df[(df['Age'] > 25) & (df['City'] == 'New York')]
df[(df['Age'] > 30) | (df['Salary'] < 50000)]
# 排序
df.sort_values(by='Age', ascending=False) # 按年龄降序
df.sort_values(by=['City', 'Age']) # 先按城市,再按年龄排序
# 选择特定行和列
df.loc[['emp1', 'emp3'], ['Name', 'City']] # 按标签选择
df.iloc[1:3, 0:2] # 按位置选择
数据分组和聚合
# 分组统计
df.groupby('City')['Age'].mean() # 按城市分组计算平均年龄
df.groupby('City').agg({'Age': ['mean', 'min', 'max'],
'Salary': 'sum'}) # 多重聚合
# 多重分组
df.groupby(['City', 'Gender']).size() # 计数
df.groupby(['City', 'Gender']).agg({'Age': 'mean',
'Salary': ['sum', 'std']})
# 自定义聚合函数
def range_func(x):
return x.max() - x.min()
df.groupby('City')['Age'].agg(range_func)
# 应用多个函数
df.groupby('City')['Age'].agg(['mean', 'count', 'std'])
时间序列处理
# 创建时间序列
date_rng = pd.date_range(start='1/1/2020', end='1/10/2020', freq='D')
time_series = pd.Series(np.random.randn(len(date_rng)), index=date_rng)
# 时间索引操作
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df.resample('M').mean() # 按月重采样计算均值
# 时间偏移
df.shift(1) # 数据向前移动1个周期
df.tshift(freq='M') # 索引时间偏移
# 滚动窗口操作
df.rolling(window=3).mean() # 3天移动平均
df.expanding().sum() # 扩展窗口求和
# 时间周期转换
df.to_period('M') # 转换为月度周期
实际应用场景
金融数据分析
- 股票价格分析:计算日收益率、移动平均线
- 风险管理:计算VaR(风险价值)、波动率
- 投资组合优化:计算资产相关性、组合收益
- 高频交易:处理tick级数据、计算订单簿指标
商业智能
- 销售报表:按地区/产品类别汇总销售数据
- 客户行为分析:RFM(最近购买、频率、金额)分析
- 库存管理:分析库存周转率、预测需求
- 市场营销:分析广告投放效果、转化率
科学研究
- 实验数据处理:清洗实验数据、计算统计指标
- 统计分析:执行t检验、ANOVA分析
- 基因组学:处理基因表达数据
- 物理学:分析实验测量数据
网络数据分析
- 用户日志分析:分析用户访问路径、停留时间
- 点击流分析:计算CTR(点击率)、转化漏斗
- A/B测试:比较实验组和对照组的指标
- 社交网络分析:计算网络中心性指标
机器学习预处理
- 特征工程:创建新特征、特征编码
- 数据清洗:处理缺失值、异常值
- 数据标准化:归一化、标准化数值特征
- 数据集划分:创建训练集、验证集、测试集
性能优化技巧
-
使用向量化操作替代循环
# 不推荐 for i in range(len(df)): df.iloc[i] = df.iloc[i] * 2 # 推荐 df = df * 2
-
选择合适的数据类型
# 将分类变量转换为category类型 df['category_column'] = df['category_column'].astype('category') # 使用整数类型替代浮点数 df['integer_column'] = df['integer_column'].astype('int32')
-
使用eval()和query()进行表达式评估
# 比传统方法更快 df.query('column1 > 100 & column2 < 50') pd.eval('df1 + df2 * df3')
-
处理大型数据集
# 使用Dask处理超出内存的数据 import dask.dataframe as dd ddf = dd.read_csv('large_file.csv') # 使用chunksize分块读取 for chunk in pd.read_csv('large_file.csv', chunksize=100000): process(chunk)
-
高效数据存储
# 使用HDF5或Parquet格式 df.to_hdf('data.h5', key='df', mode='w') df.to_parquet('data.parquet') # 读取时只选择需要的列 pd.read_hdf('data.h5', key='df', columns=['col1', 'col2'])
Pandas 的强大功能使其成为数据分析师和数据科学家的必备工具。通过灵活运用其各种功能,可以高效完成从数据清洗到分析的完整工作流程。随着Pandas的不断发展,它也在不断优化性能并添加新功能,使其在大数据处理和复杂分析场景中表现更加出色。