Pandas 数据清理实战指南
数据行业的从业者都知道,数据清理是整个数据分析周期中最重要也是最耗时的步骤。没有'干净'的、符合特定规范的数据输入,就没有有效的结果引导决策。更糟糕的是,数据清理不完整或者错误甚至会误导决策,GIGO (Garbage In, Garbage Out) 是我们最想避免的情况。
在实际工作中,我们往往需要处理大几十个公司的数据,问题都源于工业界实际应用案例。以下总结了一些高频场景的解决方案,尽量用最短的代码、最快的运行速度来解决问题。建议阅读代码前先思考遇到这些问题会怎么写,再对照解析,印象会更加深刻。
1. 合并多个 Excel 文件的多个工作表
当我们需要将当前目录下所有 Excel 文件的所有 Sheet 合并成一个 DataFrame 时,可以利用 glob 模块配合 pd.concat 实现。
import pandas as pd
import glob
df = pd.DataFrame()
# 获取当前目录下所有 xlsx 文件路径并排序
dir_filenames = sorted(glob.glob('./*.xlsx'))
for dir_file in dir_filenames:
# sheet_name=None 返回字典,key 是 sheet name,value 是工作表数据
dict_xlsx = pd.read_excel(dir_file, sheet_name=None)
# 为每个 sheet 添加来源列,然后纵向合并
workbook = pd.concat(
[v_df.assign(Sheet=k) for k, v_df in dict_xlsx.items()],
ignore_index=True
)
df = pd.concat([df, workbook], ignore_index=True)
print(f'merged files shape: {df.shape}')
解析:
glob.glob()用于返回符合 pattern 的路径和文件名。sorted()不改变原 list,需赋值给新变量。pd.read_excel(..., sheet_name=None)是关键,它能一次性读取所有 Sheet。assign()用于新增一列记录工作表名称,方便后续溯源。
2. 查看空值和处理空值
首先统计每列缺失值的数量和占比,这有助于决定下一步如何清理。
# 统计缺失值数量
count_null_series = df.isnull().sum()
count_null_df = pd.DataFrame(data=count_null_series, columns=['Num_Nulls'])
# 计算缺失值占比
pct_null_df = pd.DataFrame(data=count_null_series/len(df), columns=[])
null_stats = pd.concat([count_null_df, pct_null_df], axis=)
(null_stats)


