yq数据清洗:处理CSV中的缺失值与异常
数据清洗的痛点与解决方案
你是否还在为CSV数据中的缺失值和异常值处理耗费数小时编写Python脚本?面对格式混乱的CSV文件,手动检查每一行数据是否完整、数值是否合理往往让数据分析师头疼不已。本文将展示如何使用yq这一轻量级命令行工具,以简洁高效的方式解决CSV数据清洗中的核心问题——缺失值填充、异常值过滤和数据标准化,让你摆脱繁琐的编程工作,用单行命令完成原本需要数十行代码的清洗任务。
读完本文你将掌握:
- 3种缺失值处理策略(识别/填充/删除)的yq实现
- 4类异常值检测与修正的自动化方法
- 从CSV到JSON/YAML的无损格式转换技巧
- 构建可复用的数据清洗流水线的实战经验
环境准备与基础认知
安装yq
通过以下命令快速安装最新版本yq:
# Linux系统
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
# MacOS系统
brew install yq
# Windows系统 (Chocolatey)
choco install yq
验证安装是否成功:
yq --version
# 应输出类似: yq (https://github.com/mikefarah/yq/) version 4.40.5
CSV数据模型与yq处理机制
yq将CSV文件解析为对象数组,其中每一行对应一个对象,列标题作为对象的键。例如以下CSV:
name,numberOfCats,likesApples,height
,1,true,168.8
Samantha's Rabbit,2,false,-188.8
会被解析为:
- name: ""
numberOfCats: 1
likesApples: true
height: 168.8
- name: Samantha's Rabbit
numberOfCats: 2
likesApples: false
height: -188.8
这种数据模型转换是后续所有清洗操作的基础,我们可以直接使用yq的路径表达式和操作符处理这些对象。
处理缺失值:识别、填充与删除
1. 识别缺失值
使用select操作符结合== null或空字符串检测缺失值:
# 检测name字段为空的记录
yq -p=csv '.[] | select(.name == "")' sample_objects.csv
输出结果:
name: ""
numberOfCats: 1
likesApples: true
height: 168.8
2. 填充默认值
使用//操作符(if-null)为缺失字段设置默认值:
# 为缺失的name字段填充"Unknown"
yq -p=csv '.[] |= (.name //= "Unknown")' sample_objects.csv -o=csv
处理后的CSV:
name,numberOfCats,likesApples,height
Unknown,1,true,168.8
Samantha's Rabbit,2,false,-188.8
3. 删除含缺失值的记录
使用del结合select删除满足条件的记录:
# 删除name字段为空的记录
yq -p=csv 'del(.[] | select(.name == ""))' sample_objects.csv -o=csv
处理后的CSV仅保留完整记录:
name,numberOfCats,likesApples,height
Samantha's Rabbit,2,false,-188.8
缺失值处理方法对比
| 方法 | 命令示例 | 适用场景 | 数据保留率 |
|---|---|---|---|
| 识别 | select(.name == "") | 数据审计 | 100% |
| 填充默认值 | .name //= "Unknown" | 字段重要但允许默认值 | 100% |
| 条件填充 | .age //= (now | strftime("%Y") - 2000) | 需要动态计算默认值 | 100% |
| 删除记录 | del(.[] | select(.name == "")) | 字段必须非空 | <100% |
| 删除字段 | del(.name) | 字段整体无用 | 100% |
处理异常值:检测、过滤与修正
1. 数值范围异常检测
使用比较操作符识别超出合理范围的数值:
# 检测height为负数的记录
yq -p=csv '.[] | select(.height < 0)' sample_objects.csv
输出异常记录:
name: Samantha's Rabbit
numberOfCats: 2
likesApples: false
height: -188.8
2. 过滤异常值
结合select和比较操作符过滤合理范围内的数据:
# 仅保留height为正数的记录
yq -p=csv '.[] | select(.height >= 0)' sample_objects.csv -o=csv
过滤后的结果:
name,numberOfCats,likesApples,height
,1,true,168.8
3. 修正异常值
使用条件赋值修正可恢复的异常值:
# 将负height取绝对值
yq -p=csv '.[] |= (.height = if .height < 0 then (.height * -1) else .height end)' sample_objects.csv -o=csv
修正后的height值:
name,numberOfCats,likesApples,height
,1,true,168.8
Samantha's Rabbit,2,false,188.8
4. 数据类型转换与验证
使用type函数检测数据类型,结合to_number等函数进行转换:
# 确保numberOfCats为数字类型
yq -p=csv '.[] |= (.numberOfCats |= to_number)' sample_objects.csv
综合数据清洗案例
案例:清洗用户身高数据
原始数据(users.csv)包含多种问题:
name,age,height,email
,25,175.5,
Alice,30,-160.2,alice@example
Bob,,180,bob@example.com
清洗目标:
- 删除name为空的记录
- age填充默认值20
- height确保为正数且转换为整数
- email格式验证(含@)
清洗命令:
yq -p=csv '
# 删除name为空的记录
del(.[] | select(.name == "")) |
# 处理age字段
.[] |= (
.age //= 20 |
.age |= to_number |
# 处理height字段
.height |= if . < 0 then (. * -1) else . end |
.height |= to_number |
# 处理email字段
.email |= if test("@") then . else ("invalid_" + .) end
)
' users.csv -o=csv
清洗结果:
name,age,height,email
Alice,30,160.2,invalid_alice@example
Bob,20,180,bob@example.com
数据清洗流水线流程图
高级技巧与自动化
批量处理多个CSV文件
使用eval-all模式处理目录下所有CSV文件:
yq ea -p=csv '
# 合并所有CSV数据
(.[] | select(.name != "")) as $item ireduce ([]) + $item
' *.csv -o=csv > combined_clean.csv
构建数据清洗脚本
创建clean_csv.sh脚本实现自动化清洗:
#!/bin/bash
# 数据清洗脚本:处理缺失值和异常值
INPUT_FILE=$1
OUTPUT_FILE=${INPUT_FILE%.csv}_clean.csv
yq -p=csv '
del(.[] | select(.name == "")) |
.[] |= (
.age //= 20 |
.height |= if . < 0 then (. * -1) else . end |
.email |= if test("@") then . else null end
)
' $INPUT_FILE -o=csv > $OUTPUT_FILE
echo "清洗完成: $OUTPUT_FILE"
使用方法:./clean_csv.sh users.csv
总结与展望
本文详细介绍了使用yq处理CSV数据中缺失值和异常值的完整流程,从基础的识别填充到复杂的条件过滤,展示了yq作为命令行工具在数据清洗领域的高效性。通过将CSV解析为对象数组,yq让我们能够直接使用类似jq的强大查询语法,避免了编写复杂脚本的麻烦。
后续学习建议:
- 探索yq的日期时间处理功能,清洗时间格式不一致的数据
- 学习使用正则表达式进行高级文本字段验证
- 结合shell管道实现更复杂的数据处理流水线
数据清洗是数据分析和机器学习的基础,掌握yq这类轻量级工具能显著提升数据预处理效率。建议收藏本文作为速查手册,并关注后续关于yq高级数据处理的文章。
扩展资源
- 官方文档:https://mikefarah.gitbook.io/yq/
- 常用操作符速查表:https://mikefarah.gitbook.io/yq/operators
- CSV处理最佳实践:https://mikefarah.gitbook.io/yq/usage/csv-tsv
如果本文对你有帮助,请点赞、收藏并关注,获取更多数据处理技巧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



