做数据分析时,最让人崩溃的不是建模,而是打开 Excel 的那一刻:列名有空格、日期格式乱飞、金额里混着“¥”“元”“--”,同一个城市一会儿写“广州”,一会儿写“广州市”。
如果你还在一格一格手动改,数据量一大就会出错。今天这篇直接给你一套 Python 自动化清洗模板,把脏数据从“看了头大”变成“模型能吃”。
一、第一招:统一列名,让数据先变规矩
真实业务数据最常见的问题是列名不统一:
后续写代码时,一旦列名带空格、括号、特殊符号,就很容易报错。
import pandas as pd
df = pd.read_excel("orders.xlsx")
df.columns = (
df.columns
.str.strip()
.str.replace(" ", "_", regex=False)
.str.replace("(", "(", regex=False)
.str.replace(")", ")", regex=False)
)
print(df.columns)
建议:项目开始时先把列名统一成英文或拼音风格,比如 order_amount、city、pay_time,后续分析会顺很多。
二、第二招:金额字段清洗,专治“看起来像数字”
很多字段肉眼看是数字,实际上是字符串:
这些值不能直接求和、均值或建模,必须先转成真正的数值。
df["amount"] = (
df["amount"]
.astype(str)
.str.replace("¥", "", regex=False)
.str.replace("元", "", regex=False)
.str.replace(",", "", regex=False)
.str.replace("--", "", regex=False)
)
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
errors="coerce" 的意思是:转不了的值统一变成缺失值 NaN。这样比程序直接崩掉更适合批量处理。
三、第三招:日期字段标准化,别让时间拖后腿
日期字段也很容易乱:
用 pd.to_datetime 可以统一处理大部分格式。
df["pay_time"] = pd.to_datetime(df["pay_time"], errors="coerce")
df["year"] = df["pay_time"].dt.year
df["month"] = df["pay_time"].dt.month
df["day"] = df["pay_time"].dt.day
df["weekday"] = df["pay_time"].dt.day_name()
这样后面就可以按月份统计销售额、按星期分析转化率了。
四、第四招:类别字段去重,解决“同名不同写”
城市、渠道、产品名这些字段,最怕写法不统一。
city_map = {
"广州市": "广州",
"广州 ": "广州",
"深圳市": "深圳",
"深 圳": "深圳"
}
df["city"] = df["city"].astype(str).str.strip()
df["city"] = df["city"].replace(city_map)
清洗前可以先看看有哪些奇怪写法:
print(df["city"].value_counts(dropna=False).head(20))
五、实战:写成一个可复用清洗函数
每次复制粘贴代码很麻烦,不如封装成函数。
import pandas as pd
def clean_orders(path):
df = pd.read_excel(path)
df.columns = (
df.columns
.str.strip()
.str.replace(" ", "_", regex=False)
)
df["amount"] = (
df["amount"].astype(str)
.str.replace("¥", "", regex=False)
.str.replace("元", "", regex=False)
.str.replace(",", "", regex=False)
.str.replace("--", "", regex=False)
)
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
df["pay_time"] = pd.to_datetime(df["pay_time"], errors="coerce")
df["city"] = df["city"].astype(str).str.strip()
city_map = {"广州市": "广州", "深圳市": "深圳"}
df["city"] = df["city"].replace(city_map)
return df
clean_df = clean_orders("orders.xlsx")
clean_df.to_excel("orders_clean.xlsx", index=False)
六、清洗质量怎么检查?
清洗完不要急着分析,先跑这几行:
print(clean_df.info())
print(clean_df.isna().sum())
print(clean_df.describe())
print(clean_df.duplicated().sum())
重点看四件事:
| |
|---|
info() | |
isna().sum() | |
describe() | |
duplicated() | |
总结:自动化清洗的黄金流程
数据清洗不是低级活,它决定了后面所有分析和建模的上限。你平时最头疼哪种 Excel 脏数据?评论区聊聊。