Python pandas 全面教程
pandas 是 Python 最强大的数据分析库,提供了高效的数据结构和数据分析工具。本教程将全面介绍 pandas 的核心功能和使用方法。
1. pandas 基础
1.1 安装与导入
pip install pandas numpy
import pandas as pd
import numpy as np
1.2 核心数据结构
Series - 一维带标签数组
s = pd.Series([1, 3, 5, np.nan, 6, 8])
DataFrame - 二维表格型数据结构
df = pd.DataFrame({
'A': 1.,
'B': pd.Timestamp('20230101'),
'C': pd.Series(1, index=list(range(4)),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'
})
2. 数据输入与输出
2.1 读取数据
# 从CSV
df = pd.read_csv('data.csv')
# 从Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 从SQL
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table', conn)
# 从JSON
df = pd.read_json('data.json')
2.2 保存数据
# 保存为CSV
df.to_csv('output.csv', index=False)
# 保存为Excel
df.to_excel('output.xlsx', sheet_name='Data')
# 保存为SQL
df.to_sql('table_name', conn, if_exists='replace', index=False)
# 保存为JSON
df.to_json('output.json')
3. 数据查看与检查
3.1 查看数据
df.head() # 前5行
df.tail(3) # 后3行
df.sample(5) # 随机5行
df.shape # 形状(行,列)
df.columns # 列名
df.index # 索引
df.dtypes # 数据类型
df.info() # 数据摘要
df.describe() # 统计描述
3.2 数据选择
# 选择列
df['列名'] # 单列(Series)
df[['列1','列2']] # 多列(DataFrame)
# 选择行
df.loc[0] # 按标签
df.iloc[0] # 按位置
df[1:4] # 切片
# 条件选择
df[df['年龄'] > 30]
df.query('年龄 > 30 and 城市 == "北京"')
4. 数据清洗
4.1 处理缺失值
# 检测缺失值
df.isnull()
df.isnull().sum()
# 删除缺失值
df.dropna() # 删除含NA的行
df.dropna(axis=1) # 删除含NA的列
df.dropna(thresh=2) # 至少2个非NA值
# 填充缺失值
df.fillna(0) # 用0填充
df.fillna(method='ffill') # 前向填充
df.fillna(df.mean()) # 用均值填充
4.2 数据转换
# 数据类型转换
df['列名'] = df['列名'].astype('int')
# 重命名列
df.rename(columns={'旧名':'新名'}, inplace=True)
# 替换值
df.replace({'旧值':'新值'}, inplace=True)
# 删除列
df.drop('列名', axis=1, inplace=True)
# 删除重复行
df.drop_duplicates(inplace=True)
5. 数据操作
5.1 排序
df.sort_values('列名') # 升序
df.sort_values('列名', ascending=False) # 降序
df.sort_values(['列1','列2']) # 多列排序
5.2 分组聚合
# 基本分组
grouped = df.groupby('列名')
# 聚合操作
grouped.mean()
grouped.agg(['mean', 'sum', 'count'])
grouped.agg({'列1':'sum', '列2':'mean'})
# 分组后应用函数
grouped.apply(lambda x: x.max() - x.min())
5.3 数据合并
# 连接
pd.concat([df1, df2], axis=0) # 纵向
pd.concat([df1, df2], axis=1) # 横向
# 合并(类似SQL JOIN)
pd.merge(df1, df2, on='键列') # 内连接
pd.merge(df1, df2, on='键列', how='left') # 左连接
6. 时间序列
6.1 时间处理
# 转换为时间类型
df['日期'] = pd.to_datetime(df['日期列'])
# 设置时间索引
df = df.set_index('日期')
# 时间选择
df.loc['2023'] # 2023年数据
df.loc['2023-01':'2023-03'] # 1-3月数据
# 重采样
df.resample('M').mean() # 按月重采样
6.2 时间操作
df['年'] = df.index.year
df['月'] = df.index.month
df['周'] = df.index.weekofyear
df['季度'] = df.index.quarter
7. 数据可视化
import matplotlib.pyplot as plt
# 线图
df['列名'].plot()
# 柱状图
df['列名'].plot.bar()
# 直方图
df['列名'].plot.hist(bins=20)
# 散点图
df.plot.scatter(x='列1', y='列2')
# 箱线图
df.plot.box()
plt.show()
8. 高级功能
8.1 透视表
pd.pivot_table(df,
values='数值列',
index='行分组列',
columns='列分组列',
aggfunc=np.mean)
8.2 数据分箱
# 等宽分箱
pd.cut(df['年龄'], bins=5)
# 等频分箱
pd.qcut(df['年龄'], q=5)
8.3 文本数据处理
df['文本列'].str.upper() # 大写
df['文本列'].str.lower() # 小写
df['文本列'].str.len() # 长度
df['文本列'].str.contains('模式') # 包含
df['文本列'].str.extract(r'正则') # 提取
9. 性能优化
9.1 向量化操作
# 避免循环
df['新列'] = df['列1'] + df['列2'] # 好
df['新列'] = [x+y for x,y in zip(df['列1'], df['列2'])] # 差
9.2 高效数据类型
df['类别列'] = df['类别列'].astype('category')
df['数值列'] = pd.to_numeric(df['数值列'], downcast='integer')
9.3 大数据处理
# 分块处理
for chunk in pd.read_csv('大文件.csv', chunksize=10000):
process(chunk)
# 使用Dask
import dask.dataframe as dd
ddf = dd.read_csv('超大文件.csv')
result = ddf.groupby('列名').mean().compute()
10. 实用技巧
10.1 样式设置
# 高亮最大值
def highlight_max(s):
is_max = s == s.max()
return ['background-color: yellow' if v else '' for v in is_max]
df.style.apply(highlight_max)
10.2 内存优化
# 查看内存使用
df.memory_usage(deep=True)
# 优化存储
df = df.astype({'列名':'category'})
10.3 多级索引
df = df.set_index(['一级索引','二级索引'])
df.xs('索引值', level='二级索引')
pandas 的功能远不止于此,但掌握了这些核心功能,您就能处理大多数数据分析任务。建议在实践中不断探索 pandas 的更多高级功能。