别只学语法了!用Pandas搞定这5类真实数据清洗难题(附当当网案例代码)

张开发
2026/4/6 12:32:05 15 分钟阅读

分享文章

别只学语法了!用Pandas搞定这5类真实数据清洗难题(附当当网案例代码)
别只学语法了用Pandas搞定这5类真实数据清洗难题附当当网案例代码每次打开Jupyter Notebook准备处理数据时你是不是也遇到过这种情况——明明已经学完了Pandas官方文档的所有方法但面对实际业务数据时依然无从下手那些教程里完美的表格在现实中根本不存在取而代之的是各种脏数据混杂着中文单位的数字、格式混乱的日期、莫名其妙的缺失值...今天我们就用当当网图书销售数据作为案例直击数据清洗中最让人头疼的5类问题。不同于基础教程按函数分类的讲解方式我将从实际业务场景出发带你建立问题→解决方案的条件反射。学完这些技巧下次再遇到脏数据时你会发现自己已经能像条件反射一样快速找到解决方法。1. 特定条件下的精准更新如何避免全表扫描实际业务中最常见的需求就是当X列满足Y条件时更新Z列的值。很多初学者会先筛选出目标行再赋值这样不仅效率低还容易出错。来看当当网数据中的典型案例# 低效做法初学者常见 temp data[data[书名]一级建造师2020教材] temp[作者] 全国一级建造师执业资格考试用书编写委员会 # 专业做法使用loc一步到位 data.loc[ data[书名]一级建造师2020教材2020版一级建造师建筑工程管理与实务, [作者, 出版日期] ] [全国一级建造师执业资格考试用书编写委员会, 2020-05-01]关键技巧使用loc[row_indexer, col_indexer]同时指定行和列多列更新时右侧用列表对应位置条件表达式可以直接用在行索引位置注意当需要批量更新多个书名时可以用isin()函数替代等号判断例如data[书名].isin(book_list)2. 含中文单位的数值清洗正则表达式实战图书数据中最恼人的就是混在数字里的中文单位。比如7.5折需要提取为浮点数0.75100%需要去掉百分号。看具体解决方案# 折扣比例处理去掉折字 data[折扣比例] data[折扣比例].str.replace(折, ).astype(float) / 10 # 推荐值处理去掉百分号 data[推荐值] data[推荐值].str.replace(%, ).astype(float) # 更复杂的情况可以用正则表达式 import re data[价格] data[价格].apply( lambda x: float(re.search(r[\d\.], x).group()) )进阶技巧对格式不统一的数据先用str.contains()检查异常值使用正则表达式组提取时考虑设置默认值避免报错处理货币单位时注意小数点后位数原始值处理方法目标类型结果8.5折去折转浮点/10float0.85100%去%转浮点float100.0¥128.00正则提取数字float128.03. 日期格式混乱自动识别与强制转换出版日期可能是数据清洗中最棘手的部分当当网数据中就存在多种格式# 统一转换日期格式自动识别原始格式 data[出版日期] pd.to_datetime( data[出版日期], formatmixed, # 自动尝试多种格式 errorscoerce # 无法转换的设为NaT ).dt.strftime(%Y-%m-%d) # 统一输出格式 # 处理特殊字符的进阶方法 def clean_date(date_str): replacements {年: -, 月: -, 日: } for old, new in replacements.items(): date_str date_str.replace(old, new) return date_str data[出版日期] pd.to_datetime( data[出版日期].apply(clean_date) )避坑指南先用data[出版日期].unique()查看所有格式变体设置errorscoerce避免因个别错误导致整个操作失败对中文日期优先处理特殊字符再转换4. 缺失值处理比fillna更聪明的策略面对缺失值直接删除或填充均值可能造成分析偏差。当当网数据教给我们更专业的做法# 删除缺失率过高的列电子书价格缺失70% missing_ratio data.isnull().mean() data data.drop(columnsmissing_ratio[missing_ratio 0.7].index.tolist()) # 分类型填充推荐值 data[推荐值] data[推荐值].replace(0%, 100%) # 业务规则替换 # 按图书类别填充评论数均值 category_means data.groupby(类别)[评论数].transform(mean) data[评论数] data[评论数].fillna(category_means)缺失值处理决策树检查缺失比例70%考虑删除整列检查缺失机制是否与业务逻辑相关如0%→100%分组计算填充值比全局均值更合理最后考虑插值法或标记为特殊值5. 重复记录统计价值被低估的分析场景重复数据不只是需要删除的垃圾更是宝贵的信息源。在图书数据中我们发现# 找出重复最多的书及其次数 top_book data[书名].value_counts().idxmax() count data[书名].value_counts().max() print(f重复最多的书是《{top_book}》共出现{count}次) # 高级应用识别不同版本的图书 version_pattern r(.*?)(\d{4}版|\d年) data[书名基础] data[书名].str.extract(version_pattern)[0] version_counts data.groupby(书名基础)[书名].nunique()重复数据的商业价值高频重复可能是畅销书或数据采集问题不同版本的书名差异反映出版策略作者重复率分析可以发现高产作家综合实战构建自动化清洗管道将上述技巧封装成可复用的管道def clean_dangdang_data(raw_df): # 条件更新 author_rules { 一级建造师2020教材: 全国一级建造师执业资格考试用书编写委员会, 中国共产党简史: 中国共产党简史编写组 } for pattern, author in author_rules.items(): mask raw_df[书名].str.contains(pattern) raw_df.loc[mask, 作者] author # 单位处理 unit_cols [折扣比例, 推荐值] for col in unit_cols: raw_df[col] raw_df[col].str.extract(r([\d\.]))[0].astype(float) # 日期处理 raw_df[出版日期] pd.to_datetime( raw_df[出版日期].str.replace(r[年月日], -, regexTrue), errorscoerce ) # 缺失值处理 raw_df raw_df.drop(columns[电子书价格]) raw_df[评论数] raw_df.groupby(类别)[评论数].transform( lambda x: x.fillna(x.mean()) ) return raw_df在真实项目中这样的清洗流程通常会保存为单独的Python模块配合单元测试确保稳定性。建议将业务规则如作者映射关系提取到配置文件中方便非技术人员维护。

更多文章