乐于分享
好东西不私藏

从崩溃到优雅:用Python清洗上万行Excel数据,领导都夸我细心

从崩溃到优雅:用Python清洗上万行Excel数据,领导都夸我细心
下面为你系统介绍如何用 Python 对 Excel 数据进行清洗,涵盖合并多表格、删除重复项、拆分列、处理缺失值,并给出可直接使用的代码示例。同样,文末准备了几个吸引人的标题。

请在微信客户端打开

一、核心库与思路

核心库:pandas,基于 DataFrame 进行数据清洗,完美支持 Excel 读写。

辅助库:glob(批量匹配文件),os(路径处理)。

整体流程:

读取所有待处理的 Excel 文件并合并 →

删除重复行 →

拆分内容混杂的列(如“姓名-部门”) →

处理缺失值(填充或删除) →

保存清洗后的最终数据。

安装命令:

pip install pandas openpyxl

二、逐步实现各清洗环节

以下示例假设有一个 data 文件夹,里面存放多个结构相同但数据不同的 Excel 文件(例如各分店销售记录)。

1. 合并多个表格(批量读取 + 纵向拼接)

import pandas as pdimport globfile_paths = glob.glob("data/*.xlsx")   # 获取所有Excel文件df_list = []for file in file_paths:    df = pd.read_excel(file)    df_list.append(df)# 纵向合并所有DataFrame,忽略原有索引merged_df = pd.concat(df_list, ignore_index=True)print(f"合并后总行数: {len(merged_df)}")

如果表格是不同工作表但结构相同,也可以用 pd.read_excel(file, sheet_name=None) 遍历工作表再拼接。

2. 删除重复项

# 删除所有列完全相同的重复行merged_df = merged_df.drop_duplicates()# 根据特定列判断重复(如订单ID相同即视为重复,保留第一条)# merged_df = merged_df.drop_duplicates(subset=['订单ID'], keep='first')

3. 拆分列

常见需求:一列里同时包含“产品名称”和“型号”,用分隔符隔开,需要拆成两列。

# 假设 '产品信息' 列内容为 "产品A-型号X"split_columns = merged_df['产品信息'].str.split('-', expand=True)merged_df['产品名称'] = split_columns[0]merged_df['型号'] = split_columns[1]merged_df.drop(columns=['产品信息'], inplace=True)   # 删除原列

若分隔符不统一(如空格、逗号、横杠混用),可先用 str.extract 配合正则提取。

4. 处理缺失值

# 查看每列缺失值数量print(merged_df.isnull().sum())# 方法一:删除含有任何缺失值的行# merged_df.dropna(inplace=True)# 方法二:填充缺失值# 数值列用中位数填充merged_df['销售额'].fillna(merged_df['销售额'].median(), inplace=True)# 类别列用“未知”填充merged_df['客户类型'].fillna('未知', inplace=True)# 也可用前一个有效值填充(如时间序列)# merged_df.fillna(method='ffill', inplace=True)

三、完整清洗流程代码

下面将上述步骤整合成一个完整脚本,展示从原始文件到清洗后数据的全过程。

import pandas as pdimport glob# 1. 合并多个Excel文件files = glob.glob("data/*.xlsx")all_dfs = [pd.read_excel(f) for f in files]df = pd.concat(all_dfs, ignore_index=True)print(f"合并后数据量: {df.shape}")# 2. 删除重复项(基于所有列)df = df.drop_duplicates()print(f"去重后数据量: {df.shape}")# 3. 拆分列:如将 "姓名-部门" 拆开if '姓名部门' in df.columns:    df[['姓名''部门']] = df['姓名部门'].str.split('-', expand=True)    df.drop(columns=['姓名部门'], inplace=True)# 4. 处理缺失值# 查看缺失情况missing = df.isnull().sum()print("缺失值统计:\n", missing[missing > 0])# 填充数值列df['销售额'] = df['销售额'].fillna(df['销售额'].median())# 填充文本列df['备注'] = df['备注'].fillna('无')# 如果缺失比例过高,可直接删除该列: df.drop(columns=['某列'], inplace=True)# 5. 保存清洗后的数据df.to_excel("清洗后的数据.xlsx", index=False)print("清洗完成,已保存。")

四、常见问题与进阶技巧

数据类型转换:清洗后记得检查数值列是否为数字,用 pd.to_numeric() 转换,防止因格式问题导致统计出错。

去除首尾空格:df['列名'] = df['列名'].str.strip(),避免因空格导致匹配失败或看似重复。

大文件处理:如果文件很多或单个文件过大,可逐块读取,使用 pd.read_excel 的 chunksize 参数(需借助 pd.ExcelFile 对象循环读取)。

保留来源标识:合并时可在每个 df 中添加一列文件名,方便追溯数据来源。

清洗规则记录:建议将每一步清洗逻辑封装成函数,便于复用和维护。

编辑:余文彬
审校:余雨馨