Python数据清洗常用代码实例与操作指南
本文系统整理Python数据清洗的核心代码实例,涵盖多格式文件读写、时间序列处理、分组聚合运算、多表合并、缺失值填补及行列转换等高频场景。通过标准化pandas操作与内置函数,提供可直接复制运行的脚本模板,帮助开发者快速提升数据处理效率。
数据读取与导出基础
批量读取CSV与TXT文件
针对结构化数据,pandas 提供了高效的文件读写接口。读取CSV时可通过 encoding 指定编码格式(如 utf-8 或 gbk),并通过 sep 自定义分隔符。若遇到 ParserError: Error tokenizing data. 报错,通常是因为实际分隔符与默认逗号不符,调整 sep=\"\\t\" 即可解决。
import pandas as pd
# 读取单文件(推荐显式指定编码与分隔符)
df = pd.read_csv("data.csv", encoding="utf-8-sig", sep=",")
当数据分散在多个文件夹中时,可结合 glob 遍历路径并逐层合并。注意在拼接循环内的数据框时使用正确的变量名,避免引用未定义对象。
import glob
import os
base_dir = "./obj/"
combined_df = pd.DataFrame()
for job_folder in glob.glob(os.path.join(base_dir, "job_id=")):
csv_files = sorted(glob.glob(os.path.join(job_folder, "job_id=*.csv")))
if not csv_files:
continue
# 假设第一个文件包含表头,后续文件需跳过header或对齐列名
chunk_df = pd.concat([pd.read_csv(f) for f in csv_files], ignore_index=True)
combined_df = pd.concat([combined_df, chunk_df], ignore_index=True)
TXT纯文本处理推荐使用 with open() 上下文管理器,确保文件指针自动关闭。每行数据以字符串形式返回,配合 .strip() 清除末尾换行符,.split() 按空格或制表符切分为列表,便于后续清洗提取。
with open("sample.txt", encoding="utf-8") as f:
for line in f:
cleaned_line = line.strip()
fields = cleaned_line.split()
规范化导出数据
完成清洗后,可使用 to_csv() 写入磁盘。设置 index=False 隐藏行索引,encoding 统一为 utf-8 以避免跨平台乱码。若文件已存在,该操作会直接覆盖原文件,建议在执行前备份关键数据。
combined_df.to_csv("cleaned_output.csv", index=False, encoding="utf-8")
时间序列与日期处理
业务报表常涉及时间计算与格式化。利用 datetime 模块或 pandas 内置方法可快速完成加减法、星期判断与周期划分。
- 时间加减与格式转换:
import datetime start_str = "2022-01-12 12:11:00" time_obj = datetime.datetime.strptime(start_str, "%Y-%m-%d %H:%M:%S") time_obj += datetime.timedelta(minutes=5) print(time_obj.strftime("%Y-%m-%d %H:%M:%S")) - 判断星期几:
df = pd.DataFrame({"day": ["2021-11-12", "2021-11-13", "2021-11-14"}]) pd.to_datetime(df["day"]).dt.weekday + 1 # 返回 5,6,7(周五至周日) - 计算年内周数:
pd.to_datetime("2021-11-12").isocalendar()[1] # 获取ISO年份的第几周 - 生成时间等差数列:
注:新版 pandas 已弃用inclusive参数,改为closed。pd.date_range(start="2021-11-12", end="2021-11-14", freq="1h", closed="left")
数据分组聚合与批量运算
groupby 是进行特征统计的核心工具。可基于单列或多列(传入列表)分组,并结合 agg() 调用多种聚合函数,代码更紧凑。
df = pd.DataFrame({"性别": ["男","女","女","男","男"],
"身高": [179,160,167,170,169]})
df.groupby("性别")["身高"].mean().reset_index()
# 多指标同计算
df.groupby("性别")["身高"].agg(["mean", "max", "min"]).reset_index()
对非数值型字段或复杂逻辑,可使用 apply() 逐行/逐列执行自定义函数。批量映射替换推荐使用字典映射:
gender_dict = {"男": "Man", "女": "Woman"}
df["性别"].map(gender_dict)
表结构合并与缺失值清理
多源数据整合依赖 merge 与 concat。前者类似 SQL JOIN,支持 inner/outer/left/right 连接模式,通过 on 指定关联键;后者用于纵向堆叠(axis=0)或横向拼接(axis=1),join 控制保留全集还是交集。
# 生成笛卡尔积示例
pd.merge(df1, df2, on="value").drop("value", axis=1)
缺失值处理遵循 “识别 → 填充/删除 → 校验” 流程:
- isnull() / notnull():快速定位空值分布。
- fillna(value):按固定值、均值或插值法填补,设置 inplace=True 可原地修改。
- dropna(axis=0, how="any"):剔除含有空值的行("all" 表示全为空才删)。
行列转换与常用快捷技巧
宽窄表切换常用于适配机器学习输入要求。长转宽使用 pivot_table(index=<行键>, columns=<列键>, values=<值>);宽转长使用 melt(id_vars=[<保留列>], var_name="属性", value_name="数值")。
日常清洗中还需掌握以下快捷操作:
sort_values(by="<列名>")实现多列或单列排序reset_index()将当前索引重置为普通列drop_duplicates()精准去重str.slice()与str.split()配合正则表达式切割复杂文本- 原生列表解析式
[func(i) for i in lst]替代低效循环,性能显著提升
以上内容涵盖了从文件导入到多维清洗、表结构重组的标准工作流。掌握这些Pandas与Python内置函数的组合用法,可大幅降低手动处理数据的冗余步骤。以上就是Python数据清洗代码实例与pandas高效处理技巧的详细内容,更多关于Python数据处理与自动化脚本开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









