结论:用pandas.read_excel()读入后,按顺序执行dropna()、fillna()、astype()和str.strip().str.upper()可覆盖90%电商Excel清洗需求;关键在于严格遵循“先处理表头与空行→再分类型处理空值与异常值→然后转换数据类型→最后字符串标准化”的不可逆顺序。

直接说结论:用 pandas.read_excel() 读入,再用 dropna()、fillna()、astype() 和 str.strip().str.upper() 这四类操作就能覆盖 90% 的电商 Excel 清洗需求——关键不是学全所有方法,而是搞清哪一步该做什么、为什么不能颠倒顺序。
读取时就该处理表头和空行
电商导出的 Excel 常见问题是前几行是标题/说明/空格,真数据从第 5 行才开始;或者表头带空格、大小写混用(如 "Order ID " 后面多一个空格)。这时候硬读再删列,不如读的时候就指定参数:
- 用
skiprows=4跳过前 4 行(数清楚再填,别猜) - 用
header=0(默认)让第 1 行作列名,再立刻用df.columns = df.columns.str.strip()去掉所有列名首尾空格 - 如果表头是合并单元格或含“销售汇总”等干扰文字,优先手动在 Excel 里删掉再保存,比代码里用
skiprows+usecols组合更稳
空值和异常值必须分类型处理
电商表里 "缺货"、"N/A"、空字符串、None、np.nan 看似都是“空”,但含义不同:订单号为空是脏数据得删;销量为 0 是合理业务状态;价格为 "--" 是要转成 np.nan 再填充。别一股脑 df.dropna():
- 先用
df.isna().sum()和df["price"].unique()查清每列真实缺失形态 - 数值列(如
"sales"、"price")用df["price"] = pd.to_numeric(df["price"], errors="coerce")强制转数字,把"--"、"暂无"变成np.nan - 文本列(如
"product_name")用df["product_name"].str.strip().replace("", np.nan)清空格再标空,之后再dropna(subset=["product_name"])
日期和分类字段最容易踩类型坑
Excel 导出的日期常变成“2024/3/12”字符串或浮点数(如 45231.0),直接 astype("datetime64") 会报错或错乱;商品类目常有大小写不一、中英文括号混用(如 "手机(iPhone)" vs "手机(iPhone)"),影响后续分组统计:
立即学习“Python免费学习笔记(深入)”;
- 日期列先试
pd.to_datetime(df["order_date"], errors="coerce"),失败再看原始值是否为 Excel 序列数,用pd.to_datetime(df["order_date"], unit="d", origin="1899-12-30") - 分类列统一用
df["category"] = df["category"].str.strip().str.upper().str.replace("(", "(").str.replace(")", ")"),避免因括号全半角不同导致同一类目被拆成两组 - 别在清洗中途用
df["category"].value_counts()就下结论——先dropna()再统计,否则NaN也会算进总数里干扰判断
真正麻烦的不是单步操作,而是清洗顺序:必须先处理列名和空值形态,再转类型,最后做字符串标准化。顺序错了,比如先 astype("str") 再去空格,就会把 np.nan 变成字符串 "nan",再也无法识别为缺失值。


















