pandas 数据处理 10 个高效技巧,让分析速度提升 5 倍

1. 用向量化替代 apply

Python
import pandas as pd
import numpy as np

df = pd.DataFrame({'value': np.random.randn(1_000_000)})

# 慢:逐行 apply,约 1.2s
df['flag_apply'] = df['value'].apply(lambda x: 1 if x > 0 else 0)

# 快:向量化,约 8ms
df['flag_vec'] = np.where(df['value'] > 0, 1, 0)

2. 用 query 简化布尔索引

Python
# 可读性好且略快
result = df.query('value > 0 and category == "A"')

3. 用 category 类型省内存

Python
df['city'] = df['city'].astype('category')
# 100 万行字符串列,内存从 64MB 降到 1MB
print(df.memory_usage(deep=True))

4. 分块读取大文件

Python
chunks = []
for chunk in pd.read_csv('big.csv', chunksize=100_000):
    chunk = chunk[chunk['amount'] > 0]
    chunks.append(chunk.groupby('user_id')['amount'].sum())
result = pd.concat(chunks).groupby(level=0).sum()

5. 指定 dtype 减少内存

Python
df = pd.read_csv('data.csv', dtype={
    'user_id': 'int32',
    'amount': 'float32',
    'status': 'category'
})

6. 用 map 做字典映射

Python
mapping = {1: '待付款', 2: '已付款', 3: '已发货'}
df['status_name'] = df['status'].map(mapping)

7. groupby + agg 一次聚合多列

Python
summary = df.groupby('category').agg(
    total=('amount', 'sum'),
    avg=('amount', 'mean'),
    cnt=('order_id', 'count')
).reset_index()

8. 用 merge 时注意索引

Python
# 先设置索引再 join,比 merge 快
df1 = df1.set_index('user_id')
df2 = df2.set_index('user_id')
result = df1.join(df2, how='left')

9. 避免链式赋值

Python
# 错误:可能触发 SettingWithCopyWarning
df[df.age > 30]['score'] = 100

# 正确
df.loc[df.age > 30, 'score'] = 100

10. 用 eval 加速复杂表达式

Python
# 大表上比普通写法快 2 倍
df.eval('total = price * quantity * (1 - discount)', inplace=True)

性能实测对比

| 操作 | 普通写法 | 优化后 | 提升 | | --- | --- | --- | --- | | 条件标记 | 1.2s | 0.008s | 150x | | 字符串列内存 | 64MB | 1MB | 64x | | 大文件读取 | OOM | 3.2s | - | | 复杂计算 | 0.9s | 0.4s | 2.2x |
打赏作者 已有 0 人打赏,共 ¥0.00
我的打赏
Python猫哥
Python猫哥
Lv8 学习会员 原创 3 粉丝 2662

人生苦短,我用 Python。专注数据分析与自动化

  • 3文章
  • 6.8万总阅读
  • 4003获赞
  • 2662粉丝

评论(3)

大数据老刘・澳大利亚
category 类型这招好,我一直用 object 存字符串,内存占用确实大。
21天前 👍 56 回复 举报
Python猫哥・澳大利亚
是的,特别是做 groupby 的时候,category 提速也很明显。
1个月前 👍 16 回复 举报
算法小张・澳大利亚
np.where 的提速效果太明显了,感谢分享!
1个月前 👍 3 回复 举报