Pandas 处理 CSV 文件实战指南

用 pandas 读写与清洗 CSV 文件:read_csv 参数精讲、类型与日期处理、坏行容错、大数据分块读取、数据清洗转换与导出。

最佳实践
数据整理与查询插画

直接回答:pandas 的 read_csv 是 Python 处理 CSV 的瑞士军刀:类型推断、日期解析、缺失值处理、分块读取一应俱全;配合 DataFrame 的清洗转换能力,从"打开文件"到"出结果"只需几行代码。

安装与读取

pip install pandas
import pandas as pd

df = pd.read_csv("sales.csv")
df.head()        # 前 5 行
df.info()        # 列类型与缺失概览
df.describe()    # 数值列统计

read_csv 的关键参数

df = pd.read_csv(
    "sales.csv",
    parse_dates=["order_date"],        # 日期列直接解析
    dtype={"sku": str},                 # 编号列强制字符串(保住前导零)
    usecols=["order_date", "amount", "sku", "order_id", "city"],   # 只读需要的列
    na_values=["N/A", "未知"],          # 自定义缺失值标记
    encoding="utf-8",                   # 显式编码
    sep=";",                            # 非逗号分隔
    thousands=",",                      # 千分位数字 "1,234" -> 1234
)

大文件分块:

total = 0.0
for chunk in pd.read_csv("huge.csv", chunksize=100_000):
    amounts = pd.to_numeric(chunk["amount"], errors="coerce")
    total += amounts[amounts > 0].sum()
print(total)

此处逐块聚合,不累积所有 chunk;内存取决于块大小和计算中间结果。on_bad_lines='skip' 主要跳过列数过多等解析坏行,不处理所有类型/日期错误,使用时记录被丢弃数据。后续清洗示例使用前面完整读入的 df,而非分块累积。

清洗与转换

# 去重
df = df.drop_duplicates(subset=["order_id"])

# 缺失值:填补或丢弃
df["amount"] = df["amount"].fillna(0)
df = df.dropna(subset=["order_date"])

# 类型修正
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")

# 字符串规整
df["city"] = df["city"].str.strip().str.title()

# 派生列
df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
df["month"] = df["order_date"].dt.to_period("M")

分析一把梭

monthly = df.groupby("month")["amount"].sum()          # 月度汇总
top10 = df.nlargest(10, "amount")                       # 最大十单
pivot = df.pivot_table(values="amount", index="city",   # 透视表
                       columns="month", aggfunc="sum")

导出

monthly.to_csv("monthly_report.csv", encoding="utf-8-sig")  # 带 BOM,Excel 不乱码
df.to_csv("clean.csv", index=False)                          # 不要行索引列

导出给非技术同事时 utf-8-sig 是保命参数。

常见问题(FAQ)

Q:read_csv 内存爆了怎么办?
A:三板斧:usecols 只读需要列、dtype 精确指定(类别列用 category)、chunksize 分块。还不够就换 DuckDB 直接 SQL 查文件。

Q:日期列读成了字符串?
A:parse_dates 显式指定列名;混合格式用 date_format 或读入后 pd.to_datetime(..., format="mixed")。

Q:pandas 和 Polars 怎么选?
A:Polars 使用不同的执行和表达式模型,性能与内存需按实际数据测量,API 并非可直接替换;pandas 生态与教程最厚。性能瓶颈出现前 pandas 够用,出现后再迁 Polars。

官方参考

本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台