Python 数据分析实战:Pandas 高效处理百万级数据

码匠2小时前Python60

数据量达到百万级别时,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.5s2.1s4x
数据清洗45s3.2s14x
聚合分析12s0.8s15x
内存占用2.1GB180MB11x

五、实用代码模板

# 完整的数据处理流程模板
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

总结

处理大数据的核心原则:

  1. 能向量化就不循环
  2. 精确控制数据类型
  3. 分块处理大文件
  4. 及时释放内存
  5. 只加载需要的列

掌握这些技巧,Pandas 处理百万级数据也能游刃有余。


关于我们

如果你在 Python 数据分析项目中需要帮助,或者需要专业的技术团队支持,尊云科技可以为你提供服务。

我们专注于 Python 开发、数据分析、自动化脚本、API 接口开发,拥有丰富的项目经验。

服务范围:

  • Python 程序开发与数据分析
  • Pandas/NumPy 数据处理脚本
  • 数据可视化(Matplotlib/Plotly)
  • 自动化报表生成
  • 爬虫开发与数据抓取

联系方式:

有 Python 开发需求,欢迎联系!

相关文章

Python 自动化脚本实战:提升开发效率的10个技巧

Python 是自动化脚本的首选语言,语法简洁、生态丰富。这篇文章分享 10 个实用的 Python 自动化技巧,帮你提升开发效率。1. 批量重命名文件import os def&nb...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。