Python 怎么清洗 Excel 和 CSV 表格:空值、重复行、列名和导出一次讲清
面向日常办公和数据整理场景,讲清 Python 处理表格文件时如何检查列名、清理空值、去重、筛选字段、统一格式并导出干净 CSV。
相关工具
先明确你要清洗的不是文件,而是规则
很多人拿到一份 Excel 或 CSV,第一反应是问 Python 代码怎么写。其实更重要的是先把清洗规则说清楚:哪些列要保留,哪些列可以删,空值怎么处理,重复行按什么判断,日期要不要统一格式,金额是不是要转成数字,手机号和订单号要不要保留前导 0。规则不清楚,代码写得再快也可能把数据改坏。
真实工作里的表格往往不干净。表头可能有空格,字段名可能中英文混用,某些行是备注或合计,日期有的写 2026/7/15,有的写 2026-07-15,金额有的带元字,有的带逗号。Python 很适合批量处理这些问题,但前提是你知道哪些变化是允许的,哪些内容不能动。
如果只是偶尔处理几行数据,用在线 CSV 工具就够了;如果每天都要处理同类表格,或者文件数量很多,就适合写 Python 脚本。脚本的价值不只是快,还在于规则能复用。下次拿到同样格式的数据,重新跑一遍就能得到稳定结果。
读取表格前先检查列名
如果处理 CSV,可以先用 Python 标准库读取表头;如果处理 Excel,常见做法是用 pandas。pandas 不是标准库,适合表格清洗、筛选、统计这类任务。基础读取代码如下:
import pandas as pd
file_path = 'orders.xlsx'
df = pd.read_excel(file_path)
print(df.columns.tolist())
print(df.head())第一步打印列名非常重要。很多清洗失败不是因为数据复杂,而是列名和你想的不一样。比如表格里看起来叫“订单号”,实际列名可能是“订单号 ”,末尾带空格;也可能是“订单编号”。可以先统一清理列名前后空格:
df.columns = [str(col).strip() for col in df.columns]列名稳定以后,再决定保留哪些列。不要一上来就对所有列做处理。比如你只需要订单号、用户昵称、支付金额、下单时间,就先把这几列取出来:
needed = ['订单号', '用户昵称', '支付金额', '下单时间']
df = df[needed]这样后续逻辑更清楚,也能减少误处理。
空值和重复行要按业务含义处理
空值不是都应该删除。比如用户昵称为空,可能只是用户没填;支付金额为空,可能说明这一行不是有效订单;下单时间为空,可能是导出异常。不同字段的空值处理方式不同。可以先统计每列空值数量:
print(df.isna().sum())如果某些关键字段为空就没有意义,可以删除这些行:
df = df.dropna(subset=['订单号', '支付金额'])如果非关键字段为空,可以填默认值:
df['用户昵称'] = df['用户昵称'].fillna('未填写')不建议不分字段地把所有空值都填成同一个内容,这会让数据含义变混乱。
重复行也要看按什么字段判断。整行完全一样可以直接去重:
df = df.drop_duplicates()但订单数据通常更适合按订单号去重:
df = df.drop_duplicates(subset=['订单号'], keep='first')keep='first' 表示保留第一条。具体保留第一条还是最后一条,要看你的数据来源和业务规则。
日期、金额和编号不要混着处理
金额适合转成数字,方便后续求和和排序。常见问题是金额里带逗号、人民币符号或中文单位。可以先把它转成字符串清理,再转数字:
df['支付金额'] = (
df['支付金额']
.astype(str)
.str.replace(',', '', regex=False)
.str.replace('元', '', regex=False)
)
df['支付金额'] = pd.to_numeric(df['支付金额'], errors='coerce')日期可以用 to_datetime 统一格式:
df['下单时间'] = pd.to_datetime(df['下单时间'], errors='coerce')
df['下单日期'] = df['下单时间'].dt.strftime('%Y-%m-%d')errors='coerce' 会把无法解析的日期变成空值,方便后续检查。不要悄悄忽略解析失败的数据,最好统计一下有多少行日期异常。
编号类字段不要随便转数字。订单号、手机号、身份证号、商品编码看起来像数字,但它们本质上是标识符。转成数字可能丢失前导 0,也可能因为数字太长产生精度问题。处理这类字段时建议保留字符串,并清理前后空格:
df['订单号'] = df['订单号'].astype(str).str.strip()导出前做一次人工可读检查
清洗完以后,不要直接把文件发出去。先看行数、列名、前几行、空值统计和关键字段范围:
print('行数:', len(df))
print(df.columns.tolist())
print(df.head(10))
print(df.isna().sum())
print(df['支付金额'].describe())这些检查能帮你快速发现明显问题,比如清洗后只剩几行、金额全变空、日期解析失败。
导出 CSV 时建议使用 UTF-8 with BOM,方便 Excel 打开中文不乱码:
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,也可能影响长编号精度。
清洗后怎么确认没处理错?
至少检查行数、列名、前几行、空值统计和关键字段范围,再抽样打开导出文件确认。