请在微信客户端打开
一、核心库与思路
核心库: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 中添加一列文件名,方便追溯数据来源。
清洗规则记录:建议将每一步清洗逻辑封装成函数,便于复用和维护。

夜雨聆风