一文带你详解Python如何使用Pandas玩转表格数据
一、Pandas 是什么
Pandas 是 Python 生态系统中最重要的数据分析库之一,由 Wes McKinney 于2008年开发。它建立在 NumPy 之上,提供了高性能、易用的数据结构和数据分析工具,让处理结构化数据变得前所未有的简单。
核心定位
- 数据清洗:处理缺失值、重复数据、格式转换
- 数据转换:合并、重塑、透 视表
- 数据分析:分组统计、时间序列分析
- 数据可视化:与 Matplotlib/Seaborn 无缝集成
二、核心数据结构
Pandas 提供两种主要的数据结构,理解它们是掌握 Pandas 的关键。
2.1 Series(一维数据)
Series 是带标签的一维数组,可以存储任意数据类型。
import pandas as pd import numpy as np # 创建 Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) print(s)
输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
关键特性:
- 自动索引(0,1,2...)或自定义索引
- 支持缺失值(NaN)
- 支持向量化运算
2.2 DataFrame(二维数据)
DataFrame 是带标签的二维表格数据结构,是 Pandas 最常用的对象。
# 创建 DataFrame
dates = pd.date_range('20260101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)输出:
A B C D
2026-01-01 0.469112 -0.282863 -1.509059 -1.135632
2026-01-02 1.212112 -0.173215 0.119209 -1.044236
...
DataFrame 构成要素:
| 组件 | 说明 |
|---|---|
| index | 行标签(行索引) |
| columns | 列标签(列名) |
| values | 底层 NumPy 数组 |
| dtypes | 每列的数据类型 |
三、数据读取与写入
Pandas 支持几乎所有主流数据格式:
# CSV 文件
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
# Excel 文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('output.xlsx', sheet_name='Sheet1')
# SQL 数据库
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
df.to_sql('my_table', engine)
# JSON 数据
df = pd.read_json('data.json')
# 从字典创建
data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)四、数据查看与选择
4.1 基础查看
df.head(5) # 前5行 df.tail(3) # 后3行 df.shape # 维度 (行数, 列数) df.columns # 列名 df.index # 索引 df.describe() # 统计摘要 df.info() # 详细信息
4.2 数据选择
Pandas 提供多种选择数据的方式,推荐使用 .loc 和 .iloc:
# 按列选择 df['A'] # 选择单列,返回 Series df[['A', 'B']] # 选择多列,返回 DataFrame # 按行选择(不推荐直接用索引) df[0:3] # 切片选择前3行 # 标签选择 .loc[] df.loc['20260101'] # 选择单行 df.loc[:, ['A', 'B']] # 选择多列 df.loc['20260101':'20260103', 'A':'C'] # 行列切片 # 位置选择 .iloc[] df.iloc[3] # 第4行(从0开始) df.iloc[3:5, 0:2] # 行3-4,列0-1 df.iloc[[1, 2, 4], [0, 2]] # 特定行列 # 布尔索引(条件筛选) df[df['A'] > 0] # A列大于0的行 df[(df['A'] > 0) & (df['B'] < 0)] # 多条件组合 df[df['A'].isin([1, 2, 3])] # 包含判断
五、数据清洗(Data Cleaning)
真实数据往往 messy,Pandas 提供了强大的清洗工具:
5.1 处理缺失值
# 检测缺失值 df.isnull() # 返回布尔矩阵 df.isnull().sum() # 每列缺失值计数 # 删除缺失值 df.dropna() # 删除包含NaN的行 df.dropna(axis=1) # 删除包含NaN的列 df.dropna(how='all') # 只删除全为NaN的行 # 填充缺失值 df.fillna(0) # 用0填充 df.fillna(df.mean()) # 用均值填充 df.fillna(method='ffill') # 前向填充 df.fillna(method='bfill') # 后向填充 df.interpolate() # 插值填充
5.2 处理重复值
df.duplicated() # 检测重复行 df.drop_duplicates() # 删除重复行 df.drop_duplicates(subset=['A', 'B'], keep='last') # 基于特定列
5.3 数据类型转换
df['A'].astype(float) # 转换为浮点型
df['B'].astype('category') # 转换为类别型(节省内存)
pd.to_datetime(df['date']) # 转换为日期时间
pd.to_numeric(df['col'], errors='coerce') # 强制转换,无效值变NaN5.4 字符串处理
df['name'].str.lower() # 转小写
df['name'].str.contains('John') # 包含判断
df['name'].str.replace('a', 'b')# 替换
df['email'].str.split('@') # 分割
df['name'].str[:3] # 切片六、数据转换与重塑
6.1 应用函数
# apply:沿轴应用函数 df.apply(np.cumsum) # 累积和 df.apply(lambda x: x.max() - x.min()) # 极差 # applymap:逐元素应用(仅DataFrame) df.applymap(lambda x: len(str(x))) # map:仅用于 Series df['A'].map(lambda x: x**2)
6.2 数据合并
# concat:轴向连接 pd.concat([df1, df2]) # 纵向拼接(行) pd.concat([df1, df2], axis=1) # 横向拼接(列) # merge:数据库风格的合并 pd.merge(df1, df2, on='key') # 内连接 pd.merge(df1, df2, on='key', how='left') # 左连接 pd.merge(df1, df2, left_on='lkey', right_on='rkey') # 不同键名 # join:基于索引合并 df1.join(df2, how='outer')
6.3 数据重塑
# pivot:透 视表 df.pivot(index='date', columns='variable', values='value') # melt:宽格式转长格式 pd.melt(df, id_vars=['id'], value_vars=['A', 'B']) # stack/unstack:层级索引操作 df.stack() # 列旋转为行 df.unstack() # 行旋转为列 # pivot_table:高级透 视表 df.pivot_table(values='D', index='A', columns='B', aggfunc=np.sum)
七、分组与聚合(GroupBy)
这是 Pandas 最强大的功能之一,遵循 Split-Apply-Combine 策略:
# 基础分组
df.groupby('A').sum() # 按A分组求和
df.groupby(['A', 'B']).mean() # 多列分组求均值
# 多聚合操作
df.groupby('A').agg({
'B': ['min', 'max', 'mean'],
'C': 'sum'
})
# 转换(保持原形状)
df.groupby('A').transform(lambda x: (x - x.mean()) / x.std())
# 过滤
df.groupby('A').filter(lambda x: x['B'].sum() > 100)
# apply:自定义操作
df.groupby('A').apply(lambda x: x.sort_values('B').iloc[0])八、时间序列处理
Pandas 最初就是为金融时间序列分析设计的:
# 创建时间范围
rng = pd.date_range('2026-01-01', periods=100, freq='D') # 日频
rng = pd.date_range('2026-01-01', periods=12, freq='M') # 月频
# 时间索引
ts = pd.Series(np.random.randn(len(rng)), index=rng)
# 重采样(Resampling)
ts.resample('M').mean() # 降采样:月均值
ts.resample('D').interpolate() # 升采样:插值
# 移动窗口
ts.rolling(window=7).mean() # 7日移动平均
ts.expanding().sum() # 扩展窗口求和
# 时间偏移
ts.shift(1) # 滞后1期
ts.shift(-1) # 超前1期
# 时区处理
ts_utc = ts.tz_localize('UTC')
ts_sh = ts_utc.tz_convert('Asia/Shanghai')九、性能优化技巧
9.1 内存优化
# 查看内存使用
df.info(memory_usage='deep')
# 优化数据类型
df['int_col'] = df['int_col'].astype('int32') # 默认 int64 → int32
df['float_col'] = df['float_col'].astype('float32')
df['category_col'] = df['category_col'].astype('category') # 类别型9.2 向量化操作
避免循环,使用向量化操作:
# ❌ 慢:Python 循环
result = []
for idx, row in df.iterrows():
result.append(row['A'] + row['B'])
# ✅ 快:向量化
result = df['A'] + df['B']
# ✅ 更快:NumPy 底层
result = df['A'].values + df['B'].values9.3 使用 eval/query
# 大型 DataFrame 的表达式计算
df.eval('C = A + B', inplace=True)
df.query('A > 0 and B < 0')思考题:在处理一个 10GB 的 CSV 文件时,如何在不耗尽内存的情况下计算某列的均值?(提示:考虑 chunksize 参数或 Dask)
十、实战案例:数据分析流程
下面是一个完整的数据分析流程示例:
import pandas as pd
import numpy as np
# 1. 加载数据
df = pd.read_csv('sales_data.csv', parse_dates=['date'])
# 2. 数据清洗
df.drop_duplicates(inplace=True)
df.dropna(subset=['sales', 'quantity'], inplace=True)
df['category'] = df['category'].astype('category')
# 3. 特征工程
df['revenue'] = df['sales'] * df['quantity']
df['month'] = df['date'].dt.to_period('M')
# 4. 数据分析
monthly_sales = df.groupby('month')['revenue'].sum()
category_stats = df.groupby('category').agg({
'revenue': ['sum', 'mean', 'count'],
'quantity': 'sum'
})
# 5. 透 视分析
pivot = df.pivot_table(
values='revenue',
index='month',
columns='category',
aggfunc='sum',
fill_value=0
)
# 6. 导出结果
monthly_sales.to_csv('monthly_report.csv')
category_stats.to_excel('category_report.xlsx')十一、Pandas 3.0 新特性(2024+)
Pandas 3.0 带来了重大更新:
- PyArrow 后端:默认使用 PyArrow 字符串类型,大幅减少内存占用
- Copy-on-Write:默认启用,避免意外的数据修改
- 改进的异常信息:更清晰的错误提示
- 弃用警告:移除旧版弃用功能
# 启用 PyArrow 后端(推荐)
df = pd.read_csv('data.csv', dtype_backend='pyarrow')十二、学习资源推荐
| 资源 | 链接 | 说明 |
|---|---|---|
| 官方文档 | pandas.pydata.org | 最权威参考 |
| Pandas Cookbook | GitHub 搜索 | 实战技巧合集 |
| 《Python for Data Analysis》 | Wes McKinney 著 | 作者亲著 |
| Kaggle Learn | kaggle.com/learn | 免费交互课程 |
Pandas 是 Python 数据科学生态的基石,掌握它需要:
- 理解数据结构:Series 和 DataFrame 的本质
- 熟练选择数据:loc/iloc 的区别与应用场景
- 掌握清洗技巧:处理真实世界的脏数据
- 善用分组聚合:高效的数据汇总分析
- 注意性能优化:避免低效循环,善用向量化
最佳实践建议:
- 始终使用
.loc和.iloc而不是链式索引(df[...][...]) - 处理大型数据集时考虑使用 PyArrow 或 Dask
- 善用
inplace=True减少内存拷贝(但要注意副作用) - 代码中保留数据处理的注释,便于复现分析流程
到此这篇关于一文带你详解Python如何使用Pandas玩转表格数据的文章就介绍到这了,更多相关Python Pandas数据分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Python的typing模块:类型提示 (Type Hinting)全面解析
typing 模块是现代Python编程中一个极其重要的部分,typing模块是Python从脚本语言向工程化语言迈进的重要一步,本文给大家介绍Python的typing模块:类型提示 (Type Hinting)全面解析,感兴趣的朋友一起看看吧2025-09-09


最新评论