目 录CONTENT

文章目录

面向初级数据科学家的命令行数据清洗指南

Administrator
2025-11-21 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://www.kdnuggets.com/data-cleaning-at-the-command-line-for-beginner-data-scientists

原文作者:Bala Priya C


Data Cleaning at the Command Line for Beginner Data Scientists
Image by Author

 

# Introduction

 
当你想到数据清洗时,你可能会想到启动一个 Jupyter Notebook。但下面这件事可能会让你感到惊讶:一些最强大的数据清洗工作可以直接在你的终端中完成,使用的工具已经安装在你的系统上了。


在本文中,你将学习如何使用基本的命令行实用程序来清洗、转换和探索数据文件。无需安装任何东西;只需要你的终端和一些 CSV 文件。


在开始在命令行中清洗数据之前,我们先谈谈为什么这很重要:

  • 命令行工具易于使用、快速且高效,特别是对于大文件。
  • 这些工具内置于 Linux/macOS 中,并且在 Windows 上也可用。
  • 它们非常适合在用 Python 加载和分析数据之前对其进行初步查看。
  • 将命令链接到脚本中并使用这些脚本进行自动化非常容易。

现在,让我们开始编码吧!

注意:你可以在GitHub上的这个Bash脚本中找到所有命令。为了从本文中获得最大收益,我鼓励你打开终端并跟着操作。

 

# 设置示例数据

 
让我们创建一个需要处理的混乱 CSV 文件。这模拟了你可能会遇到的真实世界数据问题。

cat > messy_data.csv << 'EOF' name,age,salary,department,email John Lee,32,50000,Engineering,john@example.com Jane Smith,28,55000,Marketing,jane@example.com Bob Davis ,35,60000,Engineering,bob@example.com Alice Williams,29,,Marketing,alice@example.com Charlie Brown,45,70000,Sales,charlie@example.com Dave Wilson,31,52000,Engineering, Emma Davis,,58000,Marketing,emma@example.com Frank Miller,38,65000,Sales,frank@example.com John Lee,32,50000,Engineering,john@example.com Grace Lee,27,51000,Engineering,grace@example.com EOF

 

该数据集存在几个常见问题:前导和尾随空格、缺失值以及重复的行。这非常适合学习!

 

# 1. 使用 headtailwc 探索数据

 
在清洗数据之前,你需要了解你正在处理什么。让我们从基础开始。

# 查看前 5 行(包括标题) head -n 5 messy_data.csv # 查看最后 3 行 tail -n 3 messy_data.csv # 计算总行数(包括标题) wc -l messy_data.csv

 

这是它们的作用:

  • head -n 5 显示前 5 行,让你快速预览。
  • tail -n 3 显示最后 3 行(有助于检查数据是否完整)。
  • wc -l 计算行数 —— 减去标题行数 1 即可得到记录数。

输出:

name,department John Lee,Engineering Jane Smith,Marketing Bob Davis ,Engineering Alice Williams,Marketing Charlie Brown,Sales Dave Wilson,Engineering Emma Davis,Marketing Frank Miller,Sales John Lee,Engineering Grace Lee,Engineering 11 messy_data.csv

 

# 2. 使用 cut 查看特定列

 
你并不总是需要看到所有列。让我们只提取姓名和部门。

cut -d',' -f1,4 messy_data.csv

 

分解一下:

  • cut 是一个用于从每行中提取部分的工具。
  • -d',' 将分隔符设置为逗号(用于 CSV 文件)。
  • -f1,4 选择字段(列)1 和 4。
  • 你也可以使用范围:-f1-3 表示第 1 到第 3 列。

这是输出:

name,department John Lee,Engineering Jane Smith,Marketing Bob Davis ,Engineering Alice Williams,Marketing Charlie Brown,Sales Dave Wilson,Engineering Emma Davis,Marketing Frank Miller,Sales John Lee,Engineering Grace Lee,Engineering

 

# 3. 使用 sortuniq 删除重复行

 
注意我们的数据集中“John Lee”出现了两次。让我们修复一下。

# 首先保存标题行 head -n 1 messy_data.csv > cleaned_data.csv # 从数据中删除重复项(不包括标题行) tail -n +2 messy_data.csv | sort | uniq >> cleaned_data.csv

 

每个命令的作用是:head -n 1 只获取标题行。tail -n +2 获取从第 2 行开始的所有内容(跳过标题)。然后,sort 对行进行排序。请注意,uniq 只对已排序的数据有效,并且 uniq 会删除相邻的重复行。最后,>> 将内容追加到文件(与 > 覆盖不同)。

 

# 4. 使用 grep 进行搜索和过滤

 
现在让我们进行一些搜索和过滤操作。想找到所有工程师或过滤掉包含缺失数据的行?grep 在所有此类任务中都非常有用。

# 查找所有工程师 grep "Engineering" messy_data.csv # 查找包含空字段的行(两个连续的逗号) grep ",," messy_data.csv # 排除包含缺失数据的行 grep -v ",," messy_data.csv > no_missing.csv

 

在这里,grep "pattern" 搜索包含该模式的行。grep -v 反转匹配(显示不匹配的行)。这是一种快速过滤不完整记录的方法,前提是缺失值导致了双逗号(,,)。

 

# 5. 使用 sed 修剪空格

 
看到 "Bob Davis" 的记录有多余的空格了吗?让我们清理一下。

sed 's/^[ \t]*//; s/[ \t]*$//' messy_data.csv > trimmed_data.csv

 

现在我们来理解这个命令:sed 是一个用于文本转换的流编辑器。s/pattern/replacement/ 是替换语法。^[ \t]* 匹配行首的空格/制表符。[ \t]*$ 匹配行尾的空格/制表符。分号将两个操作(先修剪行首,再修剪行尾)分隔开。

 

# 6. 使用 sed 替换值

 
有时你需要标准化值或修复拼写错误。让我们尝试将所有 "Engineering" 的实例替换为 "Tech"。

# 替换所有 "Engineering" 为 "Tech" sed 's/Engineering/Tech/g' messy_data.csv 

 

接下来,让我们将空邮件字段(由行尾的逗号表示)替换为默认邮件值。

# 将空邮件字段替换为 "no-email@example.com" sed 's/,$/,no-email@example.com/' messy_data.csv

 

运行上述命令并观察输出。我在这里省略了输出以避免重复。

分解一下:

  • g 标志表示“全局”——替换每行中的所有匹配项。
  • ,$ 匹配行尾的逗号(表示最后一个字段为空)。
  • 你可以用 ; 链接多个替换操作。

 

# 7. 使用 awk 进行计数和汇总

 
awk 对于基于字段的操作非常有用。让我们做一些基本的分析。

# 按部门计数记录 tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq -c # 计算平均年龄(不包括标题和空值) tail -n +2 messy_data.csv | awk -F',' '{if($2) sum+=$2; if($2) count++} END {print "Average age:", sum/count}'

 

在这个 awk 命令中,-F',' 将字段分隔符设置为逗号,$2 指代第二个字段(年龄)。条件 if($2) 确保只处理非空值,而 sum += $2 累加总和。最后,END 块在读取完所有行后执行,计算并打印平均年龄。

输出:

 5 Engineering 3 Marketing 2 Sales Average age: 33 

 

# 8. 结合命令与管道符

 
当你将这些命令行工具链接在一起时,你可以获得更有用的处理结果。

# 获取唯一的部门,按字母顺序排序 tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq # 查找薪水 > 55000 的工程师 tail -n +2 messy_data.csv | grep "Engineering" | awk -F',' '$3 > 55000' | cut -d',' -f1,3 # 按部门计数(带计数) tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq -c | sort -rn

 

在这里,每个 | 将一个命令的输出作为下一个命令的输入。这允许你一步步构建复杂的、复杂的数据转换。最后一步按计数进行反向数值排序(-rn)。

这输出:

Engineering Marketing Sales Bob Davis ,60000 5 Engineering 3 Marketing 2 Sales

 

# 9. 转换数据格式

 
有时你需要使用不同的分隔符。在这里,我们尝试使用制表符作为分隔符而不是逗号。

# 将 CSV 转换为 TSV(制表符分隔) sed 's/,/\t/g' messy_data.csv > data.tsv # 添加一列具有固定值的列 awk -F',' 'BEGIN{OFS=","} {print $0, "2024"}' messy_data.csv > data_with_year.csv

 

在这个 awk 命令中,BEGIN{OFS=","} 将输出字段分隔符设置为逗号。$0 代表整个输入行,而 print $0, "2024" 将 "2024" 作为新列追加到每行输出的末尾。

 

# 10. 一个完整的清洗流水线

 
让我们把所有内容整合到一个有用的命令中,用于清洗我们混乱的数据:

# 保存标题 head -n 1 messy_data.csv > final_clean.csv # 清洗数据:删除重复项、修剪空格、排除缺失值 tail -n +2 messy_data.csv | \ sed 's/^[ \t]*//; s/[ \t]*$//' | \ grep -v ",," | \ sort | \ uniq >> final_clean.csv echo "Cleaning complete! Check final_clean.csv"

 

该流水线首先将标题保存到输出文件中以保留列名,然后跳过标题行来处理数据行。它会修剪每行的前导和尾随空格,删除任何包含空字段(特指双逗号)的行,对数据进行排序,并消除重复的条目。最后,将清洗后的数据追加到输出文件中。

 

# 结论

 
命令行数据清洗是一项强大但常被低估的数据科学家技能。这些工具快速且可靠。虽然你仍然会使用 Python 进行复杂的分析,但掌握这些基础知识将使你更加高效,并在 Python 不理想时为你提供更多选择。

最妙的是,这些技能可以迁移到数据工程、DevOps 和系统管理角色。学习如何在命令行中操作数据可以让你成为一个更全面的开发者。

开始用你自己的数据集练习吧,你会惊讶于自己会多么频繁地使用这些工具而不是启动 Python 笔记本。数据清洗愉快!
 
 

Bala Priya C 是一位来自印度的开发人员和技术撰稿人。她喜欢在数学、编程、数据科学和内容创作的交叉点工作。她的兴趣和专长领域包括 DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正致力于通过撰写教程、操作指南、观点文章等内容来学习并将自己的知识分享给开发者社区。Bala 还创建引人入胜的资源概览和编码教程。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区