yq数据清洗:处理CSV中的缺失值与异常

yq数据清洗:处理CSV中的缺失值与异常

【免费下载链接】yq yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor 【免费下载链接】yq 项目地址: https://gitcode.com/GitHub_Trending/yq/yq

数据清洗的痛点与解决方案

你是否还在为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

清洗目标:

  1. 删除name为空的记录
  2. age填充默认值20
  3. height确保为正数且转换为整数
  4. 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

数据清洗流水线流程图

mermaid

高级技巧与自动化

批量处理多个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的强大查询语法,避免了编写复杂脚本的麻烦。

后续学习建议:

  1. 探索yq的日期时间处理功能,清洗时间格式不一致的数据
  2. 学习使用正则表达式进行高级文本字段验证
  3. 结合shell管道实现更复杂的数据处理流水线

数据清洗是数据分析和机器学习的基础,掌握yq这类轻量级工具能显著提升数据预处理效率。建议收藏本文作为速查手册,并关注后续关于yq高级数据处理的文章。

扩展资源

  • 官方文档:https://mikefarah.gitbook.io/yq/
  • 常用操作符速查表:https://mikefarah.gitbook.io/yq/operators
  • CSV处理最佳实践:https://mikefarah.gitbook.io/yq/usage/csv-tsv

如果本文对你有帮助,请点赞、收藏并关注,获取更多数据处理技巧!

【免费下载链接】yq yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor 【免费下载链接】yq 项目地址: https://gitcode.com/GitHub_Trending/yq/yq

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值