📢 转载信息
原文链接:https://www.kdnuggets.com/data-cleaning-at-the-command-line-for-beginner-data-scientists
原文作者:Bala Priya C
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. 使用 head、tail 和 wc 探索数据
在清洗数据之前,你需要了解你正在处理什么。让我们从基础开始。
# 查看前 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. 使用 sort 和 uniq 删除重复行
注意我们的数据集中“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+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区