使用Python自动化处理Excel的脏数据
作者:爱分享的飘哥
Excel脏数据“坑”死人!重复、缺失、格式不一,数据分析全跑偏!
在日常工作中,Excel表格是我们的好伙伴,但你有没有被“脏数据”坑过?
多个人工录入,导致姓名、电话号码重复好几行。
数据来源不一,部分单元格缺失了关键信息。
“苹果”、“apple”、“Apple”……同一个商品名称,格式不统一。
年龄写成了“200岁”,销售额填成了负数,这些异常值让平均数失去意义。
这些“脏数据”就像报表中的“地雷”,轻则让你多加班几小时核对,重则导致分析结果全跑偏,决策失误!

今天,我将带你深入Python数据清洗的奇妙世界!我们将手把手教你如何利用数据处理的“瑞士军刀”——Pandas库,轻松实现:
数据去重: 一键移除重复数据,让表格清爽。
缺失值处理: 智能填充或删除“空白”,让数据完整。
格式统一: 规范字符串、转换数据类型,让数据“服服帖帖”。
异常值识别: 揪出数据中的“捣乱分子”。
最终,让你的数据分析从此变得精准可靠!
1.数据清洗第一步:Python自动化处理重复值
在Python数据清洗中,处理重复值是提高数据质量的第一个关键步骤。重复数据不仅会占用存储空间,更重要的是会导致统计结果偏差,让你的报表分析全跑偏!
1.1 什么是重复值?为什么需要去重?
场景: 你有一份客户名单,由于多次导入,同一个客户的信息出现了好几次。或者销售记录中,同一笔订单被意外记录了两次。
重复值是指在数据集中,某一行或某些列的数据与另一行(或多行)完全相同。它可能由以下原因造成:
人工录入失误: 重复输入同一条数据。
多源数据合并: 从不同系统导入数据时,没有进行去重处理。
系统故障: 导入流程中的错误导致数据重复。
为什么必须去重?
影响统计结果: 如果客户名单重复,活跃客户数就会算错;销售订单重复,总销售额就会虚高。
降低数据质量: 影响后续的数据分析和决策的精准度。
浪费存储资源: 简单的数据冗余。
1.2 Pandas drop_duplicates():一键去重,让数据清爽起来!
方案: Pandas库提供了极其强大的drop_duplicates()方法,能让你一键移除DataFrame中的重复行,这是实现Pandas数据清洗教程中不可或缺的利器!
代码:
import pandas as pd
import os
def remove_duplicates_from_excel(file_path, output_path, subset_cols=None):
"""
从Excel文件中移除重复行。
这是Python数据清洗和数据去重的核心功能。
:param file_path: 源Excel文件路径
:param output_path: 去重后Excel文件的输出路径
:param subset_cols: 可选,指定根据哪些列判断重复。如果为None,则根据所有列判断。
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"🚀 正在处理文件 '{os.path.basename(file_path)}',原始行数: {original_rows}")
if subset_cols:
# 根据指定列去重
df_cleaned = df.drop_duplicates(subset=subset_cols, keep='first') # keep='first'保留第一次出现的重复项
print(f" ℹ️ 根据列 {subset_cols} 去重。")
else:
# 根据所有列去重
df_cleaned = df.drop_duplicates(keep='first')
print(" ℹ️ 根据所有列去重。")
cleaned_rows = len(df_cleaned)
removed_count = original_rows - cleaned_rows
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_cleaned.to_excel(output_path, index=False)
print(f"✅ 去重成功!已移除 {removed_count} 条重复数据。")
print(f" 去重后数据已保存到:'{os.path.basename(output_path)}' (行数: {cleaned_rows})")
print("\n --- 去重后数据头部 ---")
print(df_cleaned.head())
except Exception as e:
print(f"❌ 去重失败:{e}")
if __name__ == "__main__":
# 准备测试Excel文件,包含重复行
# 例如:
# ID | Name | Phone
# -- | ---- | -----
# 1 | Alice| 111
# 2 | Bob | 222
# 1 | Alice| 111 <-- 重复行
# 3 | Carol| 333
# 2 | Bob | 444 <-- Phone不同,如果按ID+Name去重,则不算重复
test_excel_path = os.path.expanduser("~/Desktop/customer_data_duplicates.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/customer_data_cleaned.xlsx")
# 简单创建测试文件(包含重复)
pd.DataFrame({'ID': [1, 2, 1, 3, 2],
'Name': ['Alice', 'Bob', 'Alice', 'Carol', 'Bob'],
'Phone': ['111', '222', '111', '333', '444']}).to_excel(test_excel_path, index=False)
print("--- 示例1:根据所有列去重 ---")
remove_duplicates_from_excel(test_excel_path, output_cleaned_path)
print("\n--- 示例2:根据 'ID' 和 'Name' 列去重 ---")
remove_duplicates_from_excel(test_excel_path, os.path.expanduser("~/Desktop/customer_data_id_name_cleaned.xlsx"), subset_cols=['ID', 'Name'])
步骤:
准备Excel文件: 在桌面创建一个名为customer_data_duplicates.xlsx的Excel文件,并在其中输入一些包含重复行的数据(可参照示例代码)。
修改代码路径和去重列: 修改 test_excel_path、output_cleaned_path 和 subset_cols(如果需要)。
运行: 在VS Code终端运行 python remove_duplicates.py。
展示:

2.缺失值处理:Python智能填充,让数据完整无缺
场景: Excel表格中有很多“空白”单元格(缺失值),它们可能是数据录入时遗漏的,也可能是数据导出时出现的问题。这些缺失值会导致公式报错、分析结果不准确。
缺失值是数据质量的又一杀手。Python的Pandas库提供了灵活的缺失值处理策略,让你选择智能填充或删除,确保数据完整无缺。
实现:Pandas将缺失值统一表示为NaN(Not a Number),然后提供一系列方法来识别、填充或删除它们。
2.1 识别缺失值:isnull()/isna(),空白全部识别
在处理缺失值之前,我们首先要知道哪些地方有缺失值。
代码:
import pandas as pd
import os
def identify_missing_values(file_path):
"""
识别Excel文件中的缺失值,并显示其分布。
这是缺失值处理的第一步。
:param file_path: Excel文件路径
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"🚀 正在识别文件 '{os.path.basename(file_path)}' 中的缺失值...")
# 核心操作:isnull() 返回一个布尔型DataFrame,每个True表示一个缺失值
missing_data = df.isnull()
print("\n --- 缺失值布尔型视图(True表示缺失)---")
print(missing_data.head())
# 统计每列的缺失值数量
missing_counts = df.isnull().sum()
print("\n --- 每列缺失值数量 ---")
print(missing_counts)
# 统计总缺失值数量
total_missing = df.isnull().sum().sum()
print(f"\n 总缺失值数量: {total_missing}")
# 可选:显示缺失值比例
missing_percentage = df.isnull().sum() * 100 / len(df)
print("\n --- 每列缺失值比例 (%) ---")
print(missing_percentage)
except Exception as e:
print(f"❌ 识别缺失值失败:{e}")
if __name__ == "__main__":
# 准备测试Excel文件,包含一些缺失值 (空单元格或#N/A)
# 例如:
# Name | Age | City
# ---- | --- | ----
# Alice| 25 | NY
# Bob | NaN | LA <-- 缺失
# Carol| 30 | <-- 缺失
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx")
pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'David'],
'Age': [25, None, 30, 40],
'City': ['NY', 'LA', None, 'SF']}).to_excel(test_excel_path, index=False)
identify_missing_values(test_excel_path)
步骤:
准备Excel文件: 在桌面创建data_with_missing.xlsx,并在其中输入一些包含空单元格的数据。
修改代码路径: 修改 test_excel_path。
运行: 运行 python identify_missing.py。
展示:

2.2 填充缺失值:fillna(),智能补齐数据空白
场景: 你希望用某种合理的值来替代缺失的数据,而不是直接删除整行,以保留尽可能多的信息。比如用平均值填充年龄,或用“未知”填充空字符串。
方案: df.fillna()方法提供了多种智能填充策略,让你根据数据特性选择最合适的填充方式。
代码:
import pandas as pd
import os
def fill_missing_values(file_path, output_path, fill_strategy="mean"):
"""
填充Excel文件中的缺失值。
这是Python数据清洗和缺失值处理的核心功能,实现数据完整无缺。
:param file_path: 源Excel文件路径
:param output_path: 填充后Excel文件的输出路径
:param fill_strategy: 填充策略 ("mean", "median", "mode", "ffill", "bfill", "constant")
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"🚀 正在使用 '{fill_strategy}' 策略填充 '{os.path.basename(file_path)}' 中的缺失值...")
df_filled = df.copy() # 操作副本,不改变原DataFrame
if fill_strategy == "mean":
df_filled = df_filled.fillna(df_filled.mean(numeric_only=True)) # 填充数值列的均值
elif fill_strategy == "median":
df_filled = df_filled.fillna(df_filled.median(numeric_only=True)) # 填充数值列的中位数
elif fill_strategy == "mode":
# 众数可能不止一个,这里取第一个
for col in df_filled.columns:
if df_filled[col].isnull().any():
mode_val = df_filled[col].mode()[0] if not df_filled[col].mode().empty else None
df_filled[col] = df_filled[col].fillna(mode_val)
elif fill_strategy == "ffill": # forward fill,用前一个非缺失值填充
df_filled = df_filled.fillna(method='ffill')
elif fill_strategy == "bfill": # backward fill,用后一个非缺失值填充
df_filled = df_filled.fillna(method='bfill')
elif fill_strategy == "constant": # 用固定值填充
# 针对不同数据类型可以设置不同常数,这里简化
df_filled = df_filled.fillna("未知") # 填充字符串为“未知”
df_filled = df_filled.fillna(0, numeric_only=True) # 填充数字为0
else:
print("⚠️ 未知填充策略。")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_filled.to_excel(output_path, index=False)
print(f"✅ 缺失值填充成功!结果保存到:'{os.path.basename(output_path)}'")
print("\n --- 填充后数据头部 ---")
print(df_filled.head())
except Exception as e:
print(f"❌ 填充缺失值失败:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx") # 使用2.1节创建的文件
output_filled_path_mean = os.path.expanduser("~/Desktop/data_filled_mean.xlsx")
output_filled_path_constant = os.path.expanduser("~/Desktop/data_filled_unknown.xlsx")
# 示例1:用均值填充数值缺失值
fill_missing_values(test_excel_path, output_filled_path_mean, fill_strategy="mean")
# 示例2:用常数“未知”填充字符串缺失值
# fill_missing_values(test_excel_path, output_filled_path_constant, fill_strategy="constant")
步骤:
准备Excel文件: 使用2.1节创建的data_with_missing.xlsx文件。
修改代码路径和填充策略: 修改 test_excel_path、output_filled_path_mean 和 fill_strategy。
运行: 运行 python fill_missing.py。
展示:

2.3 删除缺失值:dropna(),保证数据完整性
场景: 有些数据行的缺失值太多,或者在关键列有缺失,导致整行数据价值不大,直接删除是更有效的处理方式。
方案: df.dropna()方法能根据你的需求,一键删除包含缺失值的行或列,确保你分析的数据集是完全完整无缺的。
代码:
import pandas as pd
import os
def drop_missing_values(file_path, output_path, how_to_drop="any", subset_cols=None):
"""
删除Excel文件中包含缺失值的行或列。
这是Python数据清洗和缺失值处理的关键功能。
:param file_path: 源Excel文件路径
:param output_path: 删除后Excel文件的输出路径
:param how_to_drop: 删除策略 ("any" - 只要有缺失就删除, "all" - 整行/列都是缺失才删除)
:param subset_cols: 可选,指定只检查这些列的缺失值
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"🚀 正在删除 '{os.path.basename(file_path)}' 中的缺失值,原始行数: {original_rows}")
# **核心操作:df.dropna()**
# how="any" 表示只要有任一缺失值就删除该行/列
# how="all" 表示只有当所有值为缺失值时才删除该行/列
# axis=0 (默认) 表示删除行,axis=1 表示删除列
df_dropped = df.dropna(how=how_to_drop, subset=subset_cols)
dropped_rows = original_rows - len(df_dropped)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_dropped.to_excel(output_path, index=False)
print(f"✅ 缺失值删除成功!已删除 {dropped_rows} 条数据。")
print(f" 删除后数据已保存到:'{os.path.basename(output_path)}' (行数: {len(df_dropped)})")
print("\n --- 删除后数据头部 ---")
print(df_dropped.head())
except Exception as e:
print(f"❌ 删除缺失值失败:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx") # 使用2.1节创建的文件
output_dropped_any = os.path.expanduser("~/Desktop/data_dropped_any.xlsx")
output_dropped_subset = os.path.expanduser("~/Desktop/data_dropped_subset.xlsx")
# 示例1:删除任何包含缺失值的行
print("\n--- 示例1:删除任何包含缺失值的行 ---")
drop_missing_values(test_excel_path, output_dropped_any, how_to_drop="any")
# 示例2:只删除 'Age' 列有缺失值的行
print("\n--- 示例2:只删除 'Age' 列有缺失值的行 ---")
drop_missing_values(test_excel_path, output_dropped_subset, how_to_drop="any", subset_cols=['Age'])
步骤:
准备Excel文件: 使用2.1节创建的data_with_missing.xlsx文件。
修改代码路径和删除策略: 修改 test_excel_path、output_dropped_any 等,并调整 how_to_drop 和 subset_cols。
运行: 运行 python drop_missing.py。
展示:

3.格式统一与异常值处理:Python让你的数据规范化
场景: Excel表格中,姓名大小写不一,“手机号”被存成了文本格式,日期混乱。还有一些明显错误的“捣乱分子”(如年龄200岁),这些都让你的Excel脏数据分析困难。
方案: Pandas能帮你自动化处理Excel脏数据中的格式不统一问题,并对异常值进行简单识别和过滤,让你的数据质量达到新高度。
作用: Pandas提供强大的字符串操作、类型转换和统计方法,用于数据的精细化管理。
3.1 字符串格式统一:大小写、空格、特殊字符,一键规范化
场景: “APPLE”、“apple”、“ Apple”……同一个商品名称,大小写、空格不一致,导致统计时被认为是不同的商品。
方案: Pandas对字符串操作非常灵活,可以轻松实现大小写转换、去除多余空格、清理特殊字符等
代码:
import pandas as pd
import os
def normalize_strings_in_excel(file_path, output_path, column_name="Product"):
"""
统一Excel指定列的字符串格式(大小写,去除空格)。
这是Python数据清洗和Excel数据处理自动化的常见操作。
:param file_path: 源Excel文件路径
:param output_path: 统一格式后Excel文件的输出路径
:param column_name: 要处理的字符串列名
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"🚀 正在统一列 '{column_name}' 的字符串格式...")
# 确保列是字符串类型,然后进行操作
if pd.api.types.is_string_dtype(df[column_name]):
# 核心操作:转换为小写,去除首尾空格
df[column_name] = df[column_name].str.lower().str.strip()
print(" ✅ 已将字符串转换为小写并去除首尾空格。")
else:
print(f"⚠️ 列 '{column_name}' 不是字符串类型,跳过格式统一。")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df.to_excel(output_path, index=False)
print(f"✨ 字符串格式统一成功!结果保存到:'{os.path.basename(output_path)}'")
print("\n --- 统一格式后数据头部 ---")
print(df.head())
except Exception as e:
print(f"❌ 字符串格式统一失败:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/product_names.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/product_names_cleaned.xlsx")
pd.DataFrame({'Product': [' APPLE ', 'Banana', 'ORANGE ', ' apple'], 'Price': [10, 5, 8, 12]}).to_excel(test_excel_path, index=False)
normalize_strings_in_excel(test_excel_path, output_cleaned_path, column_name="Product")
步骤:
准备Excel文件: 在桌面创建product_names.xlsx,包含一些大小写、空格不一致的文本数据。
修改代码路径和列名: 修改 test_excel_path、output_cleaned_path 和 column_name。
运行: 运行 python normalize_strings.py。
展示:

3.2 数据类型转换:文本变数字、日期格式化,让数据自动计算
场景: 从不同系统导出的Excel文件,数字(如销售额)被识别为文本,日期格式五花八门。这导致你无法进行计算、排序或筛选。
方案: Pandas可以强制转换列的数据类型,确保数字就是数字,日期就是日期,便于后续数据分析**。
代码:
import pandas as pd
import os
def convert_data_types_in_excel(file_path, output_path):
"""
转换Excel文件中指定列的数据类型。
这是Python数据清洗和Excel数据处理自动化的核心。
:param file_path: 源Excel文件路径
:param output_path: 转换后Excel文件的输出路径
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"🚀 正在转换 '{os.path.basename(file_path)}' 中的数据类型...")
print("\n --- 原始数据类型 ---")
print(df.dtypes)
# **核心操作1:文本列转为数值**
# errors='coerce' 会将无法转换的值变为NaN,而不是报错
df['Sales_Amount'] = pd.to_numeric(df['Sales_Amount'], errors='coerce')
# **核心操作2:统一日期格式**
df['Order_Date'] = pd.to_datetime(df['Order_Date'], errors='coerce')
# 如果需要特定日期字符串格式,可以再转换一次:df['Order_Date'] = df['Order_Date'].dt.strftime('%Y-%m-%d')
print("\n --- 转换后数据类型 ---")
print(df.dtypes)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df.to_excel(output_path, index=False)
print(f"✨ 数据类型转换成功!结果保存到:'{os.path.basename(output_path)}'")
print("\n --- 转换后数据头部 ---")
print(df.head())
except Exception as e:
print(f"❌ 数据类型转换失败:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/mixed_data.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/mixed_data_cleaned.xlsx")
# 简单创建测试文件,包含字符串形式的数字和不同格式的日期
pd.DataFrame({'Sales_Amount': ['123', '456.78', 'N/A', '789'],
'Order_Date': ['2023-01-15', '1/2/23', 'March 10, 2023', None]}).to_excel(test_excel_path, index=False)
convert_data_types_in_excel(test_excel_path, output_cleaned_path)
步骤:
准备Excel文件: 在桌面创建mixed_data.xlsx,包含字符串形式的数字和日期。
修改代码路径: 修改 test_excel_path 和 output_cleaned_path。
运行: 运行 python convert_data_types.py。
展示:

3.3 异常值简单处理:识别并过滤数据中的异常信息
场景: 数据集中出现明显不合理的值,如年龄为200岁,或销售额为负数。这些异常值会严重干扰统计分析结果。
方案: Pandas结合简单的统计方法(如描述性统计、箱线图)或基于业务规则的过滤,可以识别并过滤掉异常值,确保你的数据更可靠。
代码:
import pandas as pd
import os
def handle_outliers_simple(file_path, output_path, column_name="Age", lower_bound=0, upper_bound=120):
"""
简单处理Excel中指定列的异常值(过滤掉超出合理范围的数据)。
这是Python数据清洗和异常值处理的基础。
:param file_path: 源Excel文件路径
:param output_path: 处理后Excel文件的输出路径
:param column_name: 要检查异常值的列名
:param lower_bound: 合理范围的下限
:param upper_bound: 合理范围的上限
"""
if not os.path.exists(file_path): return print(f"❌ Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"🚀 正在处理列 '{column_name}' 中的异常值,原始行数: {original_rows}")
# 确保列是数值类型
df[column_name] = pd.to_numeric(df[column_name], errors='coerce')
df_cleaned = df.dropna(subset=[column_name]) # 先删除无法转换为数字的行
# **核心操作:基于阈值过滤异常值**
df_filtered = df_cleaned[(df_cleaned[column_name] >= lower_bound) & (df_cleaned[column_name] <= upper_bound)]
removed_outliers = original_rows - len(df_filtered)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_filtered.to_excel(output_path, index=False)
print(f"✅ 异常值处理成功!已移除 {removed_outliers} 条异常数据。")
print(f" 处理后数据已保存到:'{os.path.basename(output_path)}' (行数: {len(df_filtered)})")
print("\n --- 处理后数据头部 ---")
print(df_filtered.head())
except Exception as e:
print(f"❌ 异常值处理失败:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_outliers.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/data_outliers_cleaned.xlsx")
pd.DataFrame({'Name': ['A', 'B', 'C', 'D'],
'Age': [25, 200, 30, -5], # 包含异常值
'Score': [90, 85, 95, 10]}).to_excel(test_excel_path, index=False)
handle_outliers_simple(test_excel_path, output_cleaned_path, column_name="Age", lower_bound=1, upper_bound=100)
步骤:
准备Excel文件: 在桌面创建data_with_outliers.xlsx,包含一些明显错误的数值(如年龄200)。
修改代码路径和异常值范围: 修改 test_excel_path、output_cleaned_path 和 lower_bound/upper_bound。
运行: 运行 python handle_outliers.py。
展示:

4 你的“Excel数据贴身护卫”!
恭喜你!通过本篇文章,你已经掌握了Python数据清洗的各项核心魔法,
我们深入学习了Pandas库在Excel数据处理自动化中的应用,掌握了如何:
数据去重: 运用drop_duplicates(),一键移除重复数据,确保统计准确性。
缺失值处理: 运用fillna()进行智能填充,或dropna()删除缺失值,保证数据完整无缺。
格式统一: 对字符串进行大小写转换、去除空格,确保数据一致性。
数据类型转换: 确保数据能正确计算和分析。
异常值处理: 简单识别并过滤数据中的“捣乱分子”,让决策更精准。
这个“数据贴身护卫”,将是你在数据自动化处理道路上的又一个里程碑,为你后续的Python数据分析入门打下坚实基础!
5.展望:数据清洗魔法,开启高质量数据分析!
通过本篇文章,你已经掌握了Python数据清洗的强大能力,为你的办公自动化之旅又增添了一个重量级技能!你学会了如何利用Pandas这个Python实用工具,高效地处理Excel中的各种“脏数据”问题。
除了今天学到的功能,你还希望Python能帮你实现哪些Excel自动化操作?比如自动筛选数据并生成图表?数据透 视表自动化?你会在哪些场景下使用这个“数据清洁工”?
以上就是使用Python自动化处理Excel的脏数据的详细内容,更多关于Python处理Excel脏数据的资料请关注脚本之家其它相关文章!
