Ubuntu环境下通过pgAdmin进行数据清洗的步骤
数据清洗是提升数据质量的核心环节,主要包括缺失值处理、异常值修正、重复数据去重、格式规范化等操作。在Ubuntu系统中,可通过pgAdmin的SQL控制台或查询工具直接执行SQL语句完成清洗,以下是具体方法:
NULL值。-- 数值字段(如“工资”)用中位数填充
UPDATE 表名 SET 工资 = (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY 工资) FROM 表名)
WHERE 工资 IS NULL;
-- 分类型字段(如“性别”)用众数填充
UPDATE 表名 SET 性别 = (SELECT MODE() WITHIN GROUP (ORDER BY 性别) FROM 表名)
WHERE 性别 IS NULL;
DELETE FROM 表名 WHERE 工资 IS NULL OR 性别 IS NULL;
WHERE子句筛选异常值,并用合理值替换(如年龄超过100岁设为中位数,工资为负数设为中位数)。-- 年龄异常(>100岁)修正
UPDATE 表名 SET 年龄 = (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY 年龄) FROM 表名)
WHERE 年龄 > 100;
-- 工资异常(<0)修正
UPDATE 表名 SET 工资 = (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY 工资) FROM 表名)
WHERE 工资 < 0;
DELETE FROM 表名
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM 表名
GROUP BY 姓名, 性别, 年龄, 工资, 入职日期 -- 列出所有字段,确保唯一性
);
注:ctid是PostgreSQL的系统列,表示行的物理位置,用于唯一标识行。DATE或TIMESTAMP类型(如“2022-01-05”“20220110”统一为YYYY-MM-DD)。UPDATE 表名 SET 入职日期 = TO_DATE(入职日期, 'YYYYMMDD')
WHERE 入职日期 ~ '^\d{8}$'; -- 匹配8位数字格式(如20220110)
UPDATE 表名 SET 入职日期 = TO_DATE(入职日期, 'YYYY-MM-DD')
WHERE 入职日期 ~ '^\d{4}-\d{2}-\d{2}$'; -- 匹配YYYY-MM-DD格式
NUMERIC类型(如“5000”“6000”转为数值)。UPDATE 表名 SET 工资 = CAST(工资 AS NUMERIC)
WHERE 工资 ~ '^\d+(\.\d+)?$'; -- 匹配整数或小数
UPDATE 表名 SET 性别 = CASE
WHEN 性别 IN ('男', 'male') THEN 'M'
WHEN 性别 = '女' THEN 'F'
ELSE 性别
END;
执行清洗操作后,通过SELECT语句检查数据是否符合预期:
-- 检查缺失值是否处理完成
SELECT COUNT(*) FROM 表名 WHERE 工资 IS NULL OR 性别 IS NULL;
-- 检查异常值是否修正
SELECT * FROM 表名 WHERE 年龄 > 100 OR 工资 < 0;
-- 检查重复数据是否去重
SELECT 姓名, 性别, 年龄, COUNT(*)
FROM 表名
GROUP BY 姓名, 性别, 年龄
HAVING COUNT(*) > 1;
-- 检查日期格式是否规范
SELECT 入职日期 FROM 表名 WHERE 入职日期 !~ '^\d{4}-\d{2}-\d{2}$';
BEGIN;开启事务,清洗后通过COMMIT;提交或ROLLBACK;回滚,确保操作可逆。.sql文件,通过pgAdmin的“查询工具”→“保存”→“计划任务”(pgAgent)设置定时执行。通过以上步骤,可在Ubuntu系统的pgAdmin中高效完成数据清洗,为后续数据分析或建模奠定基础。