使用脚本清洗数据时,可以根据具体的数据问题选择编程语言,如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 脚本 适用于文本文件级别的批量处理和清理。