1. 使用合适的数据类型
默认 int64、float64 占用大量内存。转换:
python
复制
下载
df["age"] = df["age"].astype("int8") df["category"] = df["category"].astype("category")内存可下降 50% 以上。
2. 避免 iterrows
iterrows极慢。优先向量化:
python
复制
下载
# 慢 for i, row in df.iterrows(): df.at[i, "total"] = row["price"] * row["qty"] # 快 df["total"] = df["price"] * df["qty"]
3. 使用 query 和 eval
python
复制
下载
df.query("age > 30 and city == 'Beijing'") df.eval("total = price * qty", inplace=True)底层使用 numexpr,速度快、内存低。
4. 分块读取大文件
python
复制
下载
chunks = pd.read_csv("big.csv", chunksize=100_000) for chunk in chunks: process(chunk)5. 只读取需要的列
python
复制
下载
pd.read_csv("data.csv", usecols=["id", "name", "price"])6. 使用 category 类型
对于重复率高的字符串列,category 可大幅节省内存并加速 groupby。
7. 避免链式赋值
python
复制
下载
# 不推荐 df[df["age"] > 30]["score"] = 100 # 推荐 df.loc[df["age"] > 30, "score"] = 100
8. 使用 groupby 聚合优化
python
复制
下载
df.groupby("city", observed=True)["sales"].sum()observed=True对 category 列很重要。
9. 并行处理
使用pandarallel或swifter:
python
复制
下载
from pandarallel import pandarallel pandarallel.initialize() df.parallel_apply(func, axis=1)
10. 考虑 Polars
Polars 基于 Rust,支持多线程和惰性执行:
python
复制
下载
import polars as pl df = pl.read_csv("big.csv") result = df.filter(pl.col("age") > 30).group_by("city").agg(pl.col("sales").sum())在百万行以上数据中,Polars 往往比 Pandas 快数倍。
11. 实战案例
某电商订单数据 500 万行,原始 Pandas 处理耗时 120 秒。优化后:
数据类型转换:内存从 2.1GB 降到 800MB。
向量化替换 iterrows:耗时从 80 秒降到 3 秒。
分块读取 + category:整体降到 15 秒。