用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

3万行脏数据30分钟洗白:四个工具组合替代逐行手工改

🧹
数据整理这件事,说到底是四个动作:清洗、拆分、合并、转换。不管你是做报表、做分析、做迁移还是做导入,拿到手的原始数据几乎一定是脏的——格式不统一、字段混在一起、重复记录满天飞。把四个动作的趁手工具搞明白了,数据处理效率能翻几倍。

一、四类数据问题,对号入座选工具

数据脏乱差的表现形式五花八门,但归类下来就四种。每种有最适合的工具组合,混用反而效率低。

数据类型常见问题推荐工具门槛
表格数据(Excel/CSV)格式混乱、空值、重复行、多表合并、列拆分Excel Power Query / Python Pandas⭐ ~ ⭐⭐
文本日志/非结构化数据从混乱文本中提取结构化字段(姓名、电话、金额)正则表达式 + Python / grep + awk⭐⭐⭐
JSON/XML/API返回数据嵌套层级深、需要展平成表格、字段名不统一jq / Python json_normalize / 在线JSON工具⭐⭐
多源数据合并去重多份表格合并、重复记录识别、数据冲突解决Pandas merge/concat / SQL JOIN / Excel VLOOKUP⭐⭐

二、Excel Power Query:表格数据整理的首选,零代码

很多人不知道Excel自带了非常强大的数据整理引擎Power Query(Excel 2016及以上内置,2013需装插件)。它的核心逻辑是:把清洗步骤记录下来,下次新数据扔进来自动执行相同的清洗流程。

Power Query能干什么

  • 从CSV、TXT、数据库、网页、JSON等多源导入
  • 自动检测并修正数据类型(文本/数字/日期)
  • 分列(按分隔符、按字符数、按大小写转换)
  • 删除空行、删除重复行、填充空白单元格
  • 替换值、转换大小写、去除首尾空格(Trim)
  • 逆透视(把宽表转成长表)和透视列
  • 合并查询(类似SQL JOIN)和追加查询(类似UNION ALL)
  • 添加自定义列(用M语言写公式,类似Excel公式)

Power Query操作流程

1. 导入数据:数据 → 获取数据 → 从文件/从数据库
2. 清洗数据:在Power Query编辑器里做筛选、替换、分列、去重
3. 右侧"应用的步骤"面板会记录每一步操作
4. 关闭并上载:清洗后的数据加载到Excel工作表
5. 下次刷新:源文件更新后,右键点"刷新",所有清洗步骤自动重跑

核心优势:一次配置,反复使用。
比如每天收到一份格式相同的销售报表,第一次花10分钟配置清洗步骤,之后每天只需要点一下"刷新"按钮,三秒钟出结果。

Power Query常用M函数速查

// 去除首尾空格= Table.TransformColumns(源, {{"姓名", Text.Trim}})// 按分隔符分列(把"张三,13800138000"拆成两列)= Table.SplitColumn(源, "混合列", Splitter.SplitTextByDelimiter(","), {"姓名", "电话"})// 提取文本中的数字= Table.AddColumn(源, "金额", each Text.Select([备注], {"0".."9", "."}))// 统一日期格式= Table.TransformColumnTypes(源, {{"日期", type date}})// 删除所有空行= Table.SelectRows(源, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
Power Query的局限:
· 数据量超过100万行时明显变慢,不建议超过50万行
· M语言的学习曲线不低,复杂操作不如直接写Python
· 有些看似简单的操作(比如正则替换)在PQ里反而很绕
· 共享清洗模板需要把整个Excel文件发过去,不如脚本方便

三、Python Pandas:数据整理的瑞士军刀

当Power Query处理不过来(数据量大、逻辑复杂、需要正则、需要自动化定时跑),Pandas是下一个台阶。十几行代码能完成的事情,在Excel里可能要操作十几分钟。

数据清洗常用操作速查

import pandas as pdimport redf = pd.read_csv("messy_data.csv", encoding="utf-8")# ═══ 1. 列操作 ═══# 重命名列df.rename(columns={"客户姓名 ": "姓名", "电话 " : "电话"}, inplace=True)# 删除不需要的列df.drop(columns=["备注", "来源"], inplace=True)# ═══ 2. 字符串清洗 ═══# 去除所有字符串列的首尾空格str_cols = df.select_dtypes(include="object").columnsdf[str_cols] = df[str_cols].apply(lambda col: col.str.strip())# 统一大小写df["城市"] = df["城市"].str.upper()   # 全部大写df["姓名"] = df["姓名"].str.title()   # 首字母大写# 正则清洗:移除电话号码中的特殊字符df["电话"] = df["电话"].str.replace(r'[\s\-\(\)\+]', '', regex=True)# ═══ 3. 分列(把一列拆成多列) ═══# 按逗号分列:"张三,13800138000" → 姓名、电话两列df[["姓名", "电话"]] = df["混合信息"].str.split(",", expand=True)# 正则提取:从地址中提取省份和城市df["省份"] = df["地址"].str.extract(r'([\u4e00-\u9fa5]{2,3}省)')df["城市"] = df["地址"].str.extract(r'([\u4e00-\u9fa5]{2,3}市)')# ═══ 4. 空值处理 ═══# 查看每列空值数量print(df.isnull().sum())# 删除任何包含空值的行df.dropna(inplace=True)# 用指定值填充空值df["城市"].fillna("未知", inplace=True)df["金额"].fillna(df["金额"].median(), inplace=True)  # 用中位数填充# ═══ 5. 数据类型转换 ═══df["日期"] = pd.to_datetime(df["日期"], errors="coerce")df["金额"] = pd.to_numeric(df["金额"], errors="coerce")df["ID"] = df["ID"].astype("int64")# ═══ 6. 去重 ═══# 完全重复的行df.drop_duplicates(inplace=True)# 按电话去重,保留第一条df.drop_duplicates(subset=["电话"], keep="first", inplace=True)# ═══ 7. 筛选 ═══# 筛选金额大于1000的记录df = df[df["金额"] > 1000]# 多个条件筛选df = df[(df["城市"].isin(["北京", "上海", "深圳"])) & (df["金额"] > 500)]# ═══ 8. 导出 ═══df.to_csv("clean_data.csv", index=False, encoding="utf-8-sig")df.to_excel("clean_data.xlsx", index=False)

多表合并:把十几个Excel文件合成一个

from pathlib import Pathimport pandas as pddef merge_excel_files(folder, output):"""把一个文件夹里所有Excel/CSV合并成一个文件,自动去重"""all_data = []for f in Path(folder).glob("*"):if f.suffix in (".xlsx", ".xls"):df = pd.read_excel(f)elif f.suffix == ".csv":try:df = pd.read_csv(f, encoding="utf-8")except:df = pd.read_csv(f, encoding="gbk")  # 兼容中文编码else:continuedf["来源文件"] = f.name  # 标记数据来源all_data.append(df)merged = pd.concat(all_data, ignore_index=True)merged.drop_duplicates(inplace=True)# 去除所有字符串列的首尾空格for col in merged.select_dtypes("object").columns:merged[col] = merged[col].str.strip()merged.to_excel(output, index=False)print(f"合并完成: {len(all_data)} 个文件 → {len(merged)} 行(去重后)")return merged# 使用merge_excel_files("./销售报表/", "合并结果.xlsx")

模糊匹配去重:同一公司注册了六个名字怎么办

精确去重处理不了"腾讯科技"和"腾讯科技有限公司"这种问题,需要模糊匹配:

from difflib import SequenceMatcherdef fuzzy_dedupe(df, column, threshold=0.85):"""模糊去重:相似度超过阈值的视为重复,保留第一条"""names = df[column].dropna().unique()duplicates = set()for i, name1 in enumerate(names):if name1 in duplicates:continuefor name2 in names[i+1:]:if name2 in duplicates:continueratio = SequenceMatcher(None, name1, name2).ratio()if ratio >= threshold:duplicates.add(name2)print(f"模糊匹配: {name1}{name2} (相似度: {ratio:.2%})")return df[~df[column].isin(duplicates)]# 使用:对"公司名称"列做模糊去重,相似度85%以上视为重复clean_df = fuzzy_dedupe(df, "公司名称", threshold=0.85)
模糊匹配的阈值怎么设?
· 0.95以上:几乎相同(只差标点符号或空格)
· 0.85-0.95:高度相似("腾讯科技" vs "腾讯科技有限公司")
· 0.75-0.85:可能相似也可能不同,需要人工确认
· 低于0.75:大概率是不同的实体,不建议自动去重
建议先用阈值0.85跑一遍,把匹配结果打印出来人工审核后再决定是否保留。

四、jq:JSON数据的命令行手术刀

API返回的JSON数据动辄嵌套四五层,直接用眼睛看能看瞎。jq是处理JSON数据的最强命令行工具,一条命令就能把复杂JSON拍平成干净的表格。

# 安装jq(Windows用choco或scoop,Mac用brew,Linux用apt/yum)# choco install jq# 美化JSON输出cat data.json | jq '.'# 提取嵌套字段:取出所有用户的姓名和邮箱cat users.json | jq '.[] | {name: .profile.name, email: .contact.email}'# 拍平嵌套数组为CSV格式cat orders.json | jq -r '.[] | [.id, .customer.name, .total, .items | length] | @csv'# 筛选:只保留金额大于1000的订单cat orders.json | jq '.[] | select(.total > 1000)'# 分组统计:按城市统计用户数量cat users.json | jq 'group_by(.city) | map({city: .[0].city, count: length})'# 从多层嵌套中提取数据并输出为CSVcat api_response.json | jq -r '.data.items[] | [.sku, .name, .price.amount, .stock.available] | @csv' > products.csv

Python json_normalize:把嵌套JSON展平成DataFrame

import pandas as pdimport json# 加载深层嵌套JSONwith open("nested_data.json") as f:data = json.load(f)# json_normalize 自动展平嵌套结构# {"user": {"name": "张三", "address": {"city": "北京"}}} → user.name, user.address.citydf = pd.json_normalize(data["items"])# 展平嵌套列表(每个订单的items数组展开成多行)df = pd.json_normalize(data["orders"],record_path=["items"],        # 要展开的列表字段meta=["order_id", "customer"]  # 父级字段保留)# 展平后导出为Exceldf.to_excel("flattened_data.xlsx", index=False)

五、命令行文本处理:日志和纯文本的结构化提取

不是所有数据都规规矩矩待在Excel或JSON里。服务器日志、爬虫输出、邮件导出、聊天记录——这些非结构化文本里也藏着结构化数据。awk + sed + grep 的组合拳在这里最管用。

# ═══ 日志提取 ═══# 从Nginx日志中提取每个IP的请求次数(前20名)awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20# 提取指定时间段内的请求grep "26/Jul/2026:1[4-5]:" access.log > afternoon_requests.log# 提取返回码为500的错误请求awk '$9 == 500 {print $0}' access.log > errors_500.log# ═══ 文本清洗 ═══# 删除文件中的所有空行sed '/^$/d' messy.txt > clean.txt# 删除行首行尾空白sed 's/^[[:space:]]*//;s/[[:space:]]*$//' messy.txt > clean.txt# 把所有连续多个空格替换成单个制表符(转TSV)sed 's/[[:space:]]\{2,\}/\t/g' data.txt > data.tsv# ═══ 数据提取 ═══# 提取文件中所有手机号(中国大陆11位)grep -oP '1[3-9]\d{9}' messy_data.txt | sort -u > phones.txt# 提取所有邮箱地址grep -oP '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' data.txt | sort -u# 提取所有金额(含小数)grep -oP '\d+\.?\d*' report.txt
命令行文本处理的组合套路:
grep 负责筛选 → sed 负责替换和格式化 → awk 负责提取列和计算 → sort | uniq -c 负责统计 → 最后重定向到文件。这五个命令排列组合能解决90%的纯文本整理需求。

六、在线工具:不用装任何软件

偶尔处理一次数据,不想装Python也不想学Power Query,这几个在线工具能帮上忙。

工具核心功能适合场景数据安全
CSV LintCSV格式校验、编码检测、列类型识别、自动修复CSV文件打不开或导入报错时✅ 纯本地
TableConvert表格格式互转(CSV↔JSON↔SQL↔Markdown↔HTML↔LaTeX)需要把数据转成特定格式时✅ 纯本地
Regex101正则表达式在线测试和调试,实时高亮匹配结果写正则表达式提取数据前先测试⚠️ 数据上传
JSON CrackJSON可视化树状图,直观展示嵌套结构看不懂复杂JSON结构时⚠️ 数据上传
CyberChef数据处理的瑞士军刀:编解码、加密解密、文本处理、数据转换Base64解码、URL解码、十六进制转换等✅ 纯本地
敏感数据不要上传到在线工具:
客户名单、销售数据、员工信息、财务数据——这些包含敏感信息的数据,一律用本地工具处理(Power Query、Python、命令行)。标了"⚠️ 数据上传"的在线工具,只能用来处理测试数据或公开数据。

七、数据整理常见场景速查表

场景快速方案一句话说明
去空格df['col'].str.strip()Pandas一行搞定,Excel用TRIM函数
分列df['col'].str.split(',', expand=True)比Excel分列向导快,支持正则
去重df.drop_duplicates()指定列去重用subset参数
空值填充df.fillna(0)也可以用均值/中位数/众数填充
日期格式统一pd.to_datetime(df['col'])自动识别各种日期写法
多表合并pd.concat(dfs)纵向追加;横向用merge
正则提取df['col'].str.extract(r'pattern')从混乱文本中提取结构化字段
大小写统一.str.lower() / .str.upper()避免"北京""BeiJing""BEIJING"被当成三个城市
JSON展平pd.json_normalize(data)嵌套JSON一键变平表
异常值检测df.describe() + 箱线图先看统计摘要,再看分布

八、不同数据量级的工具选择

几百行

小数据

1 - 3万行脏数据30分钟洗白:四个工具组合替代逐行手工改 - UC建站系统

Excel自带功能足够。筛选、查找替换、分列、去重、数据验证——不需要学新工具,Excel里全部能搞定。

几千到几万行

中型数据

Power QueryPandas。如果是重复性的清洗任务(每天都要洗),Power Query的步骤录制最省事;如果逻辑复杂,Pandas更灵活。

2 - 3万行脏数据30分钟洗白:四个工具组合替代逐行手工改 - UC建站系统

几十万到百万行

大数据

Pandas是唯一选择。Excel打开都费劲。Pandas处理百万行毫无压力,加个chunksize参数还能处理更大的。

千万行以上

海量数据

3 - 3万行脏数据30分钟洗白:四个工具组合替代逐行手工改 - UC建站系统

导入数据库用SQL处理,或者用Dask/Polars替代Pandas。Dask的API和Pandas几乎一样,但支持分布式计算。

九、一个完整的自动化清洗流水线

如果你每周或每天都要处理同一格式的脏数据,把清洗步骤写成脚本,配置定时任务自动跑。下面是一个完整的数据清洗流水线模板:

import pandas as pdimport refrom pathlib import Pathfrom datetime import datetimeclass DataCleanPipeline:"""通用数据清洗流水线"""def __init__(self, input_path, output_dir="./cleaned"):self.df = self._load(input_path)self.output_dir = Path(output_dir)self.output_dir.mkdir(exist_ok=True)self.log = []def _load(self, path):"""自动识别文件类型加载"""path = Path(path)if path.suffix == ".csv":try:return pd.read_csv(path, encoding="utf-8")except:return pd.read_csv(path, encoding="gbk")elif path.suffix in (".xlsx", ".xls"):return pd.read_excel(path)elif path.suffix == ".json":return pd.read_json(path)else:raise ValueError(f"不支持的文件格式: {path.suffix}")def strip_whitespace(self):"""去除所有字符串列的首尾空格"""before = len(self.df)for col in self.df.select_dtypes("object").columns:self.df[col] = self.df[col].str.strip()self.log.append(f"去除空格完成")return selfdef remove_empty_rows(self):"""删除完全为空的行"""before = len(self.df)self.df.dropna(how="all", inplace=True)self.log.append(f"删除空行: {before - len(self.df)} 行")return selfdef deduplicate(self, subset=None):"""去重"""before = len(self.df)self.df.drop_duplicates(subset=subset, inplace=True)self.log.append(f"去重: 删除 {before - len(self.df)} 行重复")return selfdef normalize_phone(self, col="电话"):"""统一手机号格式:去除非数字字符"""if col in self.df.columns:self.df[col] = self.df[col].astype(str).str.replace(r'\D', '', regex=True)self.log.append("手机号格式统一完成")return selfdef standardize_dates(self, col="日期"):"""统一日期格式"""if col in self.df.columns:self.df[col] = pd.to_datetime(self.df[col], errors="coerce")self.log.append("日期格式统一完成")return selfdef generate_report(self):"""生成数据质量报告"""report = {"总行数": len(self.df),"总列数": len(self.df.columns),"空值统计": self.df.isnull().sum().to_dict(),"各列数据类型": self.df.dtypes.astype(str).to_dict(),"操作日志": self.log}return reportdef save(self, filename=None):"""保存清洗结果"""if filename is None:timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = f"cleaned_{timestamp}.xlsx"output_path = self.output_dir / filenameself.df.to_excel(output_path, index=False)# 同时保存数据质量报告report = self.generate_report()report_path = self.output_dir / f"report_{timestamp}.txt"with open(report_path, "w", encoding="utf-8") as f:for key, value in report.items():f.write(f"{key}: {value}\n")self.log.append(f"结果已保存: {output_path}")print(f"✅ 清洗完成: {output_path}")return self# ─── 使用示例:一行链式调用搞定全部清洗 ───if __name__ == "__main__":DataCleanPipeline("dirty_sales_data.csv") \.strip_whitespace() \.remove_empty_rows() \.deduplicate(subset=["电话"]) \.normalize_phone() \.standardize_dates() \.save()

UC建站系统的数据整理中心

对于需要频繁处理网站数据的用户,UC建站系统内置了数据整理中心,把上述工具的能力整合到了统一面板中:

多源数据导入
支持Excel/CSV/JSON/API/数据库五种数据源一键导入,自动检测编码和分隔符
可视化清洗管道
拖拽式配置清洗步骤(去空格→分列→去重→格式统一),实时预览每一步的结果
智能去重引擎
精确去重+模糊去重双模式,可配置相似度阈值和保留策略,支持预览匹配结果
定时清洗任务
保存清洗管道为模板,设置定时自动执行,清洗完成后自动导出并发送通知
数据质量报告
自动生成数据质量评分、缺失值分布图、异常值标记、字段类型一致性检查
多站点数据汇总
跨站点数据自动汇聚,统一清洗后按站点维度拆分输出,支持自定义汇总维度

最后说几句

数据整理这件事,工具不是最重要的,整理流程的标准化才是。拿到一份脏数据,第一反应不是打开Excel开始手工改,而是先观察数据结构、记录所有不规范的格式、设计清洗步骤、然后选工具执行。如果同样的数据源要反复处理,把清洗步骤写成脚本或Power Query模板,下次一键跑通。

工具选择上有个简单的判断逻辑:数据在Excel能打开且不卡→用Power Query录制清洗步骤;数据太大Excel打不开→上Pandas;数据是JSON→jq或json_normalize;数据是非结构化文本→grep+sed+awk组合;偶尔用一次不想装软件→在线工具(敏感数据除外)。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录