数据清洗(脚本)

使用脚本清洗数据时,可以根据具体的数据问题选择编程语言,如Shell、Python、SQL等。这里我以 Python(Pandas库)SQL 为例,演示如何通过脚本进行数据清洗。

1. 使用 Python(Pandas库) 进行数据清洗

Python 的 pandas 库非常适合处理大规模数据清洗任务,以下是一些常见的数据清洗操作:

1.1 处理缺失值
复制代码

python

复制代码

import pandas as pd # 读取数据(可以是CSV、Excel等格式) df = pd.read_csv('data.csv') # 查看缺失值 print(df.isnull().sum()) # 方法1: 删除包含缺失值的行 df_cleaned = df.dropna() # 方法2: 使用均值或其他方式填充缺失值 df['age'] = df['age'].fillna(df['age'].mean()) # 用均值填充年龄缺失值 df['city'] = df['city'].fillna('Unknown') # 用'Unknown'填充城市缺失值 # 保存清洗后的数据 df_cleaned.to_csv('cleaned_data.csv', index=False)

1.2 处理重复数据
复制代码

python

复制代码

# 查看重复数据 print(df.duplicated()) # 删除重复行 df_cleaned = df.drop_duplicates() # 保留最新的数据行,删除重复的记录 df_cleaned = df.drop_duplicates(subset='customer_id', keep='last')

1.3 格式不一致的清洗
复制代码

python

复制代码

# 将所有字符串字段转换为小写 df['name'] = df['name'].str.lower() # 日期格式统一转换 df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d') # 去除前后空格 df['address'] = df['address'].str.strip()

1.4 处理异常值
复制代码

python

复制代码

# 查看统计信息以识别异常值 print(df.describe()) # 方法1: 删除明显的异常值,如年龄不可能为300 df_cleaned = df[(df['age'] > 0) & (df['age'] < 120)] # 方法2: 用中位数替换异常值 median_age = df['age'].median() df['age'] = df['age'].apply(lambda x: median_age if x > 120 else x) # 方法3: 标记异常值,不删除 df['age_outlier'] = df['age'].apply(lambda x: 1 if x > 120 else 0)

1.5 数据格式转换
复制代码

python

复制代码

# 将货币格式转换为数值 df['price'] = df['price'].replace({'\$': '', ',': ''}, regex=True).astype(float)

2. 使用 SQL 进行数据清洗

SQL适用于在数据库中直接进行数据清洗操作,以下是一些常见的SQL清洗操作。

2.1 处理缺失值
复制代码

sql

复制代码

-- 删除缺失值所在的行 DELETE FROM orders WHERE customer_name IS NULL; -- 使用默认值填充缺失字段 UPDATE customers SET city = 'Unknown' WHERE city IS NULL; -- 使用均值填充数值字段的缺失值 UPDATE customers SET age = (SELECT AVG(age) FROM customers) WHERE age IS NULL;

2.2 处理重复数据
复制代码

sql

复制代码

-- 删除重复行 DELETE FROM customers WHERE customer_id IN ( SELECT customer_id FROM customers GROUP BY customer_id HAVING COUNT(customer_id) > 1 ); -- 删除特定列重复的数据(保留最新记录) WITH RankedCustomers AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY last_update DESC) AS rn FROM customers ) DELETE FROM RankedCustomers WHERE rn > 1;

2.3 格式不一致的清洗
复制代码

sql

复制代码

-- 将名字字段中的所有字符转换为小写 UPDATE customers SET name = LOWER(name); -- 格式化日期字段 UPDATE orders SET order_date = TO_DATE(order_date, 'YYYY-MM-DD') WHERE order_date IS NOT NULL;

2.4 处理异常值
复制代码

sql

复制代码

-- 删除异常值(如年龄大于120岁) DELETE FROM customers WHERE age > 120; -- 用中位数替换异常值 WITH MedianAge AS ( SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY age) AS median_age FROM customers ) UPDATE customers SET age = (SELECT median_age FROM MedianAge) WHERE age > 120;

2.5 数据格式转换
复制代码

sql

复制代码

-- 转换货币格式,将字符串中的货币符号移除并转为数字 UPDATE products SET price = CAST(REPLACE(REPLACE(price, '$', ''), ',', '') AS DECIMAL);

3. 使用 Shell 脚本 进行简单数据清洗

Shell 脚本适合处理文件级别的简单数据清洗操作,例如清洗 CSV 文件中的数据。

3.1 清理CSV文件中的空行
复制代码

bash

复制代码

# 删除空行并输出到新文件 sed '/^$/d' data.csv > cleaned_data.csv

3.2 批量替换文本
复制代码

bash

复制代码

# 将所有的 'NULL' 替换为 'Unknown' sed 's/NULL/Unknown/g' data.csv > cleaned_data.csv

3.3 删除重复行
复制代码

bash

复制代码

# 删除文件中的重复行 sort data.csv | uniq > cleaned_data.csv

总结

使用脚本进行数据清洗的选择取决于具体的数据问题和工作环境:

  • Python(Pandas) 非常适合处理复杂的大数据集和数据分析。
  • SQL 更适合在数据库中直接操作数据,尤其是结构化数据的清洗。
  • Shell 脚本 适用于文本文件级别的批量处理和清理。
相关推荐
2601_9622841711 天前
基于Apache Cassandra与Python的数据建模及ETL实践
python·nosql·etl·数据建模·apachecassandra
想吃披萨12 天前
Kettle下载地址
etl
RestCloud13 天前
飞书多维表格落地新思路:ETL做数据导入,豆包做业务智能分析
数据仓库·飞书·etl·数据传输·api对接·豆包
鸽芷咕15 天前
金仓KES向量数据库实战:一条SQL干掉ETL,机器人不再把停产货当现货卖
数据库·sql·etl
RestCloud17 天前
从Kettle迁移到ETLCloud:作业转换、调度迁移与平滑过渡方案
etl·kettle·etlcloud·数据传输·数据同步·数据集成平台
RestCloud18 天前
不同系统集成:CRM系统与ERP、财务系统的数据双向同步
etl·crm·erp·数据集成·etlcloud·数据传输·数据同步
Patrick在香港19 天前
把 Claude 塞进 pandas 管道:7 条脏地址实测,5 条自动清洗、2 条被闸门拦下
python·pandas·etl·claude·数据清洗
RestCloud25 天前
行业数据集成架构对比:金融、制造、政务三大场景的差异化设计
金融·架构·制造·etl·etlcloud·数据传输·数据集成平台
zgl_200537791 个月前
源代码:跨数据库通用“字段级”数据血缘解析与图形化(2/3:标注信息的拆解、检验、保存)
大数据·数据库·数据仓库·sql·数据挖掘·etl·嵌入式实时数据库
楠楠子呀1 个月前
独立站聊天转化全链路:从二维码引流到数据复盘
java·javascript·数据仓库·python·c#·自动化·etl