编程与 AI12 分钟阅读更新于 2026-07-15

Python 怎么清洗 Excel 和 CSV 表格:空值、重复行、列名和导出一次讲清

面向日常办公和数据整理场景,讲清 Python 处理表格文件时如何检查列名、清理空值、去重、筛选字段、统一格式并导出干净 CSV。

相关工具

先明确你要清洗的不是文件,而是规则

很多人拿到一份 Excel 或 CSV,第一反应是问 Python 代码怎么写。其实更重要的是先把清洗规则说清楚:哪些列要保留,哪些列可以删,空值怎么处理,重复行按什么判断,日期要不要统一格式,金额是不是要转成数字,手机号和订单号要不要保留前导 0。规则不清楚,代码写得再快也可能把数据改坏。

真实工作里的表格往往不干净。表头可能有空格,字段名可能中英文混用,某些行是备注或合计,日期有的写 2026/7/15,有的写 2026-07-15,金额有的带元字,有的带逗号。Python 很适合批量处理这些问题,但前提是你知道哪些变化是允许的,哪些内容不能动。

如果只是偶尔处理几行数据,用在线 CSV 工具就够了;如果每天都要处理同类表格,或者文件数量很多,就适合写 Python 脚本。脚本的价值不只是快,还在于规则能复用。下次拿到同样格式的数据,重新跑一遍就能得到稳定结果。

读取表格前先检查列名

如果处理 CSV,可以先用 Python 标准库读取表头;如果处理 Excel,常见做法是用 pandas。pandas 不是标准库,适合表格清洗、筛选、统计这类任务。基础读取代码如下:

python代码示例
import pandas as pd

file_path = 'orders.xlsx'
df = pd.read_excel(file_path)
print(df.columns.tolist())
print(df.head())

第一步打印列名非常重要。很多清洗失败不是因为数据复杂,而是列名和你想的不一样。比如表格里看起来叫“订单号”,实际列名可能是“订单号 ”,末尾带空格;也可能是“订单编号”。可以先统一清理列名前后空格:

python代码示例
df.columns = [str(col).strip() for col in df.columns]

列名稳定以后,再决定保留哪些列。不要一上来就对所有列做处理。比如你只需要订单号、用户昵称、支付金额、下单时间,就先把这几列取出来:

python代码示例
needed = ['订单号', '用户昵称', '支付金额', '下单时间']
df = df[needed]

这样后续逻辑更清楚,也能减少误处理。

空值和重复行要按业务含义处理

空值不是都应该删除。比如用户昵称为空,可能只是用户没填;支付金额为空,可能说明这一行不是有效订单;下单时间为空,可能是导出异常。不同字段的空值处理方式不同。可以先统计每列空值数量:

python代码示例
print(df.isna().sum())

如果某些关键字段为空就没有意义,可以删除这些行:

python代码示例
df = df.dropna(subset=['订单号', '支付金额'])

如果非关键字段为空,可以填默认值:

python代码示例
df['用户昵称'] = df['用户昵称'].fillna('未填写')

不建议不分字段地把所有空值都填成同一个内容,这会让数据含义变混乱。

重复行也要看按什么字段判断。整行完全一样可以直接去重:

python代码示例
df = df.drop_duplicates()

但订单数据通常更适合按订单号去重:

python代码示例
df = df.drop_duplicates(subset=['订单号'], keep='first')

keep='first' 表示保留第一条。具体保留第一条还是最后一条,要看你的数据来源和业务规则。

日期、金额和编号不要混着处理

金额适合转成数字,方便后续求和和排序。常见问题是金额里带逗号、人民币符号或中文单位。可以先把它转成字符串清理,再转数字:

python代码示例
df['支付金额'] = (
    df['支付金额']
    .astype(str)
    .str.replace(',', '', regex=False)
    .str.replace('元', '', regex=False)
)
df['支付金额'] = pd.to_numeric(df['支付金额'], errors='coerce')

日期可以用 to_datetime 统一格式:

python代码示例
df['下单时间'] = pd.to_datetime(df['下单时间'], errors='coerce')
df['下单日期'] = df['下单时间'].dt.strftime('%Y-%m-%d')

errors='coerce' 会把无法解析的日期变成空值,方便后续检查。不要悄悄忽略解析失败的数据,最好统计一下有多少行日期异常。

编号类字段不要随便转数字。订单号、手机号、身份证号、商品编码看起来像数字,但它们本质上是标识符。转成数字可能丢失前导 0,也可能因为数字太长产生精度问题。处理这类字段时建议保留字符串,并清理前后空格:

python代码示例
df['订单号'] = df['订单号'].astype(str).str.strip()

导出前做一次人工可读检查

清洗完以后,不要直接把文件发出去。先看行数、列名、前几行、空值统计和关键字段范围:

python代码示例
print('行数:', len(df))
print(df.columns.tolist())
print(df.head(10))
print(df.isna().sum())
print(df['支付金额'].describe())

这些检查能帮你快速发现明显问题,比如清洗后只剩几行、金额全变空、日期解析失败。

导出 CSV 时建议使用 UTF-8 with BOM,方便 Excel 打开中文不乱码:

python代码示例
df.to_csv('clean_orders.csv', index=False, encoding='utf-8-sig')

如果导出给程序使用,也可以用普通 utf-8。导出前要确认是否需要保留索引。大多数业务表格不需要 pandas 自动生成的索引列,所以 index=False 比较常用。

最后可以把导出的 CSV 放到站内 CSV 工具里抽查,看看列数、空行、重复行是否符合预期。Python 负责批量处理,工具负责快速预览和校验。两个结合起来,比只靠肉眼翻 Excel 稳很多。

常见问题

处理 Excel 一定要用 pandas 吗?

不一定。简单 CSV 可以用标准库 csv。涉及 Excel、筛选、去重、统计和日期处理时,pandas 会更方便。

手机号为什么不建议转成数字?

手机号是标识符,不是用于计算的数值。转数字可能丢失前导 0,也可能影响长编号精度。

清洗后怎么确认没处理错?

至少检查行数、列名、前几行、空值统计和关键字段范围,再抽样打开导出文件确认。

Python 实用

继续阅读

返回专题