Python 数据分析实战:Pandas 高效处理百万级数据
数据量达到百万级别时,Pandas 还能保持高效吗?这篇文章分享我在实际项目中总结的大数据处理技巧,让你的代码运行速度提升 10 倍以上。
一、数据读取优化
1. 分块读取大文件
当 CSV 文件超过 1GB 时,直接 read_csv 会占用大量内存。使用 chunksize 分块处理:
import pandas as pd
# 分块读取,每次处理 10 万行
chunks = pd.read_csv('big_data.csv', chunksize=100000)
# 逐块处理
for chunk in chunks:
# 处理逻辑
processed = chunk.groupby('category').sum()
# 保存或合并结果
2. 指定数据类型
默认情况下 Pandas 会推断数据类型,往往不够精确。手动指定可以大幅减少内存占用:
# 定义数据类型
dtypes = {
'user_id': 'int32', # 默认 int64,改为 int32 节省一半内存
'age': 'int8', # 小整数用 int8
'score': 'float32', # 默认 float64,改为 float32
'category': 'category' # 字符串重复值多时用 category
}
df = pd.read_csv('data.csv', dtype=dtypes)
# 查看内存占用
print(df.memory_usage(deep=True).sum() / 1024**2, 'MB')
二、数据处理优化
1. 向量化操作代替循环
Pandas 的底层是 C 实现的,向量化操作比 Python 循环快 100 倍以上:
# ❌ 慢:Python 循环
for idx, row in df.iterrows():
df.loc[idx, 'new_col'] = row['col1'] + row['col2']
# ✅ 快:向量化操作
df['new_col'] = df['col1'] + df['col2']
# ✅ 快:apply(比循环快,但比向量化慢)
df['new_col'] = df.apply(lambda x: x['col1'] + x['col2'], axis=1)
2. 使用 query 进行筛选
# 传统方式
df_filtered = df[(df['age'] > 18) & (df['score'] > 80)]
# 使用 query(更简洁,性能相当)
df_filtered = df.query('age > 18 and score > 80')
3. 合并数据优化
# 如果 key 是有序的,使用 merge_ordered 更快
df_merged = pd.merge_ordered(df1, df2, on='key')
# 大数据集合并时,先排序再合并
df1 = df1.sort_values('key')
df2 = df2.sort_values('key')
df_merged = pd.merge(df1, df2, on='key', sort=False) # sort=False 避免重复排序
三、内存优化技巧
1. 及时删除不需要的变量
# 处理完大文件后,及时释放内存 import gc del big_dataframe gc.collect() # 强制垃圾回收
2. 使用分类类型(Category)
# 字符串列如果有大量重复值,转为 category 类型
df['city'] = df['city'].astype('category')
# 效果:内存占用从 100MB 降到 5MB
3. 只加载需要的列
# 只读取需要的列,减少内存占用
df = pd.read_csv('big_data.csv', usecols=['user_id', 'amount', 'time'])
四、性能对比实测
处理 100 万行数据的对比:
| 操作 | 传统方法 | 优化方法 | 提升 |
|---|---|---|---|
| 读取数据 | 8.5s | 2.1s | 4x |
| 数据清洗 | 45s | 3.2s | 14x |
| 聚合分析 | 12s | 0.8s | 15x |
| 内存占用 | 2.1GB | 180MB | 11x |
五、实用代码模板
# 完整的数据处理流程模板
import pandas as pd
import gc
def process_big_data(file_path):
# 1. 定义数据类型
dtypes = {
'user_id': 'int32',
'amount': 'float32',
'category': 'category'
}
# 2. 分块读取和处理
chunks = pd.read_csv(file_path, dtype=dtypes, chunksize=50000)
results = []
for chunk in chunks:
# 3. 数据清洗(向量化操作)
chunk['amount'] = chunk['amount'].fillna(0)
chunk = chunk[chunk['amount'] > 0] # query 筛选
# 4. 聚合计算
result = chunk.groupby('category')['amount'].sum()
results.append(result)
# 5. 释放内存
del chunk
gc.collect()
# 6. 合并结果
final_result = pd.concat(results).groupby(level=0).sum()
return final_result
总结
处理大数据的核心原则:
- 能向量化就不循环
- 精确控制数据类型
- 分块处理大文件
- 及时释放内存
- 只加载需要的列
掌握这些技巧,Pandas 处理百万级数据也能游刃有余。
关于我们
如果你在 Python 数据分析项目中需要帮助,或者需要专业的技术团队支持,尊云科技可以为你提供服务。
我们专注于 Python 开发、数据分析、自动化脚本、API 接口开发,拥有丰富的项目经验。
服务范围:
- Python 程序开发与数据分析
- Pandas/NumPy 数据处理脚本
- 数据可视化(Matplotlib/Plotly)
- 自动化报表生成
- 爬虫开发与数据抓取
联系方式:
- 微信:yvsm316
- QQ:316430983
- 官网:https://zunyun.cc/
有 Python 开发需求,欢迎联系!
