数据分析入门数据清洗,基础清洗步骤
目录

数据分析入门数据清洗,基础清洗步骤 | 九数云-E数通

eshutong 发表于2026年8月20日

很多人在学数据分析时,会把大多数精力放在模型和可视化上,但真正让分析结论产生价值的,恰恰是最不起眼的数据清洗。我自己经历过一个真实项目:拿到某电商平台近一年约124万行订单数据,准备做复购分析时,原以为一两天就能建模,结果前19天全耗在清洗上。数据清洗不是“准备动作”,它的产出物也不是“干净数据”,而是你能否顺利完成分析、业务是否愿意信任你结论的关键地基。下面我会先把结论讲清楚,再用一个完整案例复盘数据清洗基础步骤的落地过程,包括我踩过的坑、沉淀下来的规则和一套可直接复用的判断逻辑。

核心结论:数据清洗占分析工时的六成以上,却最容易被低估

  1. 我给的结论可能和很多入门教程相反
    市面上大多数《数据分析入门》教程会告诉你:数据清洗就是把缺失值补上、把重复值删掉、把格式统一一下。这确实是最基础的动作,但它们把清洗讲成了一道道机械操作题,好像做完这些数据就“干净”了。我的结论是:数据清洗的核心不是“清掉脏数据”,而是把业务口径和边界条件显性化。那些看起来是脏数据的东西,往往不是在记录时写错了,而是上游业务规则不统一、产品迭代改了字段定义、跨部门对同一指标的理解不一致留下的痕迹。清洗动作本身只是为了把这些“痕迹”翻译成分析模型能理解的规则。
  2. 一组来自一线项目的时间统计

2023年上半年我们团队同时推进两个分析项目。一个是用户标签体系重构,另一个是月度经营分析自动化。两个项目最终都没有卡在建模上,而是卡在数据准备环节。用户标签项目总耗时37天,其中数据清洗占23天,探索性分析占6天,特征工程占4天,模型调优和报告各占2天。数据清洗一项就吃掉62%的项目周期,远超“模型训练”和“调参”的总和。这不是我们团队低效,而是当数据来源多、口径杂、跨部门协作时,清洗天然是一个反复确认、分批修补的过程。

数据分析入门数据清洗,基础清洗步骤

为什么大多数团队会低估清洗

第一,脏数据是“看不见的”。一张表只有几千行时,肉眼抽查可能发现不了问题;可当数据量到百万行,某些字段的错误率只有2%,但分析结果会因为样本量过大而稳定偏移。第二,清洗没有标准答案。同一个字段处理成什么样,取决于你接下来要算哪种指标,这让入门者很难照着模板抄。第三,脏数据是缓慢累积的。短期看不出灾难,往往到季度复盘会才发现上月报表口径错了,而这时候再回溯,成本已经翻了好几倍。

我后来带项目时,每次都会把数据清洗时间按“采集数据量的20%”做保底预估,这个经验法则比任何框架都实用。

真实场景:一个订单数据清洗项目的完整复盘

  1. 项目背景
    2023年7月,我接手一个电商复购分析项目。数据源来自小程序商城、App、某第三方电商平台三个渠道,日订单量约3.2万条。我们的目标是用RFM模型给用户分层,输出高价值用户名单和运营策略。最初的设想是:订单表拉到本地,做一次简单清洗,用pandas跑分组统计就行。但真正落库后,我却连续踩了一周的坑。
  2. 我踩过的五个坑

(1)同一笔退款单在两套对账系统里被记成两笔。原因是上游系统里,一笔退款在“退款单表”状态为“成功”,在“支付流水表”里状态字却是“REFUND_SUCCESS”。两条记录在不同系统使用了不同的状态编码,我按关联键去重后,发现大量“重复订单”。这个坑如果不处理,后面算复购率会直接翻倍。

(2)“支付时间”字段有4种格式。“2023-07-01 12:03:45”里有全角冒号;“20230701”是纯数字字符串;“2023/07/01 12:03:45”用了斜杠;还有一个渠道的时间戳精确到秒,却是13位数字。这导致排序和时间差计算全乱。

(3)用户昵称里混着emoji和Unicode控制字符。昵称本身不影响RFM计算,但一旦分析标题里要展示用户信息,就会出现无法入库的乱码。某些字符在导出CSV时还会把一列数据“挤”成两行,直接破坏表结构。

(4)优惠券金额出现“-0.01”。一开始我以为是计算错误,后来查了业务文档才知道这是系统占位值,代表“现金抵扣但金额为0.01元”。如果没有业务确认,任何统计口径都会出错。

(5)同一用户ID在三个渠道互不相同。三个渠道各自生成用户标识,没有全局统一ID。清洗之前必须先做用户映射,否则所有基于“用户”的分析都无从谈起。

清洗规则从0到26条的过程

我们最开始只有10条基础规则:去重、处理格式、删空值。随着对业务的理解加深,规则逐步演化成26条,分为三类:基础完整性规则8条,业务一致性规则9条,口径统一性规则9条。比如检查“支付金额与商品金额合计是否相等”“订单状态与支付时间是否冲突”“退款金额不得大于支付金额”。这些规则不会是AI自动识别出来的,而是靠业务人员逐个确认。我把每条规则写进一个Python配置文件,后续每次跑数都自动执行。

这就是清洗从“一次性动作”转变成“可复用资产”的关键。

数据分析入门数据清洗,基础清洗步骤

清洗前后对比

这是一组最终被写进项目总结的数据:订单异常率从清洗前的12%降到0.3%,SKU匹配率从88.1%提升到99.6%,财务对账差错从每月47笔降到3笔。更重要的是,这张表后来被财务、运营、客服三个部门同时引用,没人再质疑“数据对不对”。这也让我意识到,清洗的收益不只是分析准确率提升,还包括跨部门协作成本的下降。以后有人在会上对着同一张表争论数字口径时,你应该知道,这些争论本该在清洗阶段解决。

数据分析入门数据清洗,基础清洗步骤

常见误区:把“看起来干净”当成“能用于分析”

  1. 误区一:用Excel肉眼扫一遍就当干净了
    用筛选和条件格式检查几千行数据,总是比写一行Python代码更“直观”。但当数据量到几十万行,肉眼只能发现“空值”和“明显的格式差异”,发现不了跨表逻辑矛盾。我们项目里最严重的“退款重复”问题,Excel里看起来每行都是合法订单。真正发现问题的是在对账时发现退款金额比GMV还高,才回溯到源头。
  2. 误区二:缺失值全部删除
    很多教程会教你“缺失值删除法”,但删除必须基于缺失机制。我们处理订单数据时,有一版错误地把“支付流水缺失”的订单删掉,结果这19%的订单恰好都是线下支付订单。它们不是数据错误,而是业务逻辑中本来就不需要线上流水。删掉之后,线下渠道的销量直接归零,整个区域分析彻底失真。
  3. 误区三:按唯一ID去重,忽略了业务键
    数据表里通常有一个自增主键或数据库唯一键,但唯一键不能等于业务键。同一笔订单,在系统重试时会被生成两条记录,主键不同,但订单号相同、金额相同,只有创建时间差了0.3秒。如果只按主键去重,这种“半重复”数据会永远留在库里。因此去重时必须指定业务主键,比如“订单号+支付流水号+用户ID”的组合。
  4. 误区四:只清洗分析字段,不验证跨表关联
    分析用户复购时,我一开始只清洗订单表,忽略了用户表和商品表。等做完标签再看,发现用户表里有17%的注册时间晚于第一次下单时间。说明订单表关联的用户数据本身有回溯写入,或用户ID错乱。跨表关联的字段如果没纳入清洗范围,单表再干净也挡不住结论出错。
  5. 误区五:清洗一次就完事,不沉淀规则

手工清洗最大的坏处是“下次再来一次”。我见过很多团队每周把同一份月度报表数据重新下载,重复做一模一样的数据处理,一个月浪费3-4人天。更糟糕的是,如果这次清洗用了某个纠错规则而没有记录下来,下次数据里同类问题出现时,你还得重新排查一次。

数据分析入门数据清洗,基础清洗步骤

这些误区的共同根源

它们都来自同一个错误假设:数据是“对与错”的二元问题。事实上,数据清洗面对的是“已知的有效、未知的有效、已知的无效、未知的无效”四种状态。你不能用简单规则一次判定所有行,而是要先给每个问题分类,再决定是删除、填充还是保留。这就是我下面要讲的三层清洗模型存在的意义。

专业判断逻辑:清洗要按“结构层,值域层,业务逻辑层”三层递进

  1. 结构层:表和列的基本合法性
    结构层是清洗的最底层,回答的是“这个表能不能被程序安全读取”。具体包括:表是否有唯一主键,字段名是否冲突,列的类型是否一致,是否存在文件编码问题,是否存在合并单元格或换行符破坏列结构等。很多Excel导出的数据到这一步就会出问题,因为用户在一个单元格里手动换行,导出时会把一行拆成两行。结构层不解决,后面所有步骤都跑不起来。
  2. 值域层:字段的取值范围、格式与枚举合法性
    值域层回答的是“这个字段里的值是有效值吗”。例如:年龄是否在0到120之间,日期是否符合时间格式,性别枚举是否只有“男、女、未知”,价格是否出现负数。值域层清洗常用规则表达式、范围检查、枚举匹配来完成。这一层对应的就是入门教程里最常讲的“格式统一、异常值识别”的部分。
  3. 业务逻辑层:跨字段、跨表、跨时间的一致性

业务逻辑层回答的是“多个字段放一起是否和业务规则冲突”。例如“订单创建时间”应该早于“支付时间”,“退款金额”不得大于“支付金额”,“会员等级”应该是“累计消费金额”的分箱结果。这是最考验业务理解的一层,也是普通教程几乎不涉及的部分。但缺少这一层,你会漏掉项目里最严重的脏数据。

数据分析入门数据清洗,基础清洗步骤

  1. 基础清洗步骤如何对应三层模型
    我做数据清洗时,不会机械地按“去重→缺失→格式→异常”顺序走,而是按三层模型排优先级。先去重和主键校验对应结构层;然后做缺失值登记、类型转换、格式规范、异常值识别,对应值域层;最后做跨字段校验、多源关联校验,对应业务逻辑层。这个顺序能保证你在进入下一步之前,已经确认了底层结构可信。每完成一层,我都会启动一次抽样人工抽查,防止规则写错而一直错到底。
  2. 基础清洗步骤详解:8个步骤的完整落地

步骤一:复制原表并建立清洗日志

很多入门教程跳过了这一步,直接开始去重。但我在真实项目里吃过亏:一次清洗脚本参数漏填,pandas直接把原表覆盖了,导致原始数据丢失,不得不用备份重建。正确的第一步是复制一份工作副本,并建立一个清洗日志文件或日志表,记录每一行数据在什么时候、被哪条规则、改成了什么值。这个日志是你后续和业务方确认口径时的唯一依据,也是沉淀规则的基础。

import pandas as pd
import datetime

df = pd.read_csv("order_data_raw.csv", dtype=str)

df.to_csv("order_data_work.csv", index=False)

cleaning_log = []

def record(rule_name, affected_rows, description):

cleaning_log.append({

"time": datetime.datetime.now().isoformat(),

"rule": rule_name,

"affected_rows": affected_rows,

"description": description

})

步骤二:去重与主键校验

去重不是简单调用drop_duplicates,而是先确认业务主键。我建议先检查“数据库唯一键”和“业务主键”是否重复。数据库唯一键是行级的,通常称为id;业务主键是真实世界里唯一标识一笔业务的组合键。在订单数据场景,我们使用“订单号+支付流水号+渠道编号”作为组合业务键。你会发现只按订单号去重会把App渠道和第三方渠道的同号订单误删,因此组合键必须经过业务确认。

# 检查业务主键是否唯一
key_cols = ["order_no", "payment_flow_no", "channel_id"]

print("总行数:", len(df))

print("业务主键去重后行数:", len(df.drop_duplicates(subset=key_cols)))

dup_mask = df.duplicated(subset=key_cols, keep=False)

dup_count = dup_mask.sum()

record("dedup_check", dup_count, f"按{','.join(key_cols)}检测到重复记录")

若存在真正重复,按人工确认的规则保留最新一条

df_cleaned = df.drop_duplicates(subset=key_cols, keep="last")

步骤三:缺失值入场登记与分类处理

缺失值不能一概而论,也不能简单按列dropna。我习惯把它分为四类:完全随机缺失、结构化缺失、占位值导致的假缺失、可推导缺失。完全随机缺失在样本量足够时可以删除;结构化缺失必须保留或单独打标记;占位值如“-9999”“-0.01”要先转换或忽略;可推导缺失则根据同一条记录的其他字段推出来。

# 先看每一列的缺失数量和占比
missing_summary = df.isnull().sum()

missing_ratio = missing_summary / len(df)

print(pd.DataFrame({"缺行数": missing_summary, "缺失率": missing_ratio}))

示例:支付时间缺失,但从订单状态可推导

mask_paid = df["order_status"] == "PAID"

mask_no_pay_time = df["payment_time"].isnull()

print("已支付但支付时间为空的记录数:", (mask_paid & mask_no_pay_time).sum())

这类缺失优先用其他字段推导或标记为“渠道逻辑不需要”

df.loc[mask_paid & mask_no_pay_time, "payment_time_is_missing"] = "需人工确认"

步骤四:数据类型统一与格式规范

常见的数据类型问题是“金额被存成字符串”“日期有多种格式”“手机号被Excel转成科学计数法”。这时候不能直接astype转换,因为一旦遇到格式不一致,pandas会抛异常或引入缺失。正确的做法是先把格式化函数跑一遍,再转换类型。

import re
def normalize_datetime(s):

if pd.isnull(s):

return None

s = str(s).replace(":", ":").replace("/", "-").strip()

m = re.search(r"(\d{4}[-/]\d{1,2}[-/]\d{1,2}).*?(\d{1,2}:\d{2}:\d{2})?", s)

if not m:

return None

if m.lastindex == 2:

return m.group(1) + " " + m.group(2)

return m.group(1) + " 00:00:00"

df["payment_datetime"] = df["payment_time"].apply(normalize_datetime)

df["payment_datetime"] = pd.to_datetime(df["payment_datetime"], errors="coerce")

步骤五:异常值识别与边界确认

异常值识别分两条路:数学统计法和业务规则法。数学统计法适合发现“分布异常”,比如IQR法、Z-Score;业务规则法适合发现“逻辑非法”,比如“退款金额大于订单金额”。我在项目中坚持一个原则:没有经过业务确认的异常值不能随意删除。因为你用IQR筛出来的离群点,可能只是促销活动产生的高额订单。

# 用IQR识别金额字段的高偏分布
q1 = df["order_amount"].quantile(0.25)

q3 = df["order_amount"].quantile(0.75)

iqr = q3 – q1

lower_bound = q1 – 1.5 * iqr

upper_bound = q3 + 1.5 * iqr

outlier_mask = (df["order_amount"] upper_bound)

print("疑似异常订单数:", outlier_mask.sum())

输出样本让业务方确认,而非直接删除

df.loc[outlier_mask, ["order_no", "order_amount", "pay_amount"]].sample(10).to_csv("outlier_to_confirm.csv")

数据分析入门数据清洗,基础清洗步骤

步骤六:文本清洗与编码统一

文本类字段往往藏着看不见的坑:全角空格、不可见字符、emoji、CVS导出的编码混乱、中英文标点混用。文本清洗的目的不是把文本变成多标准,而是保证同一实体在不同记录里能对上。我的做法是建立“统一规则”:去掉首尾空白、统一全半角、转小写、去除控制字符、再按枚举值映射。

import unicodedata
import re

def clean_text(s):

if pd.isnull(s):

return None

s = str(s)

s = unicodedata.normalize("NFKC", s)  # 统一全角半角

s = re.sub(r"[\u0000-\u001f\u007f]", "", s)  # 去除控制字符

s = re.sub(r"\s+", " ", s).strip()

return s

df["user_name_clean"] = df["user_name"].apply(clean_text)

去除emoji

emoji_pattern = re.compile(

"["

"\U0001F300-\U0001FAFF"

"\U00002600-\U000027BF"

"]+", flags=re.UNICODE

)

df["user_name_clean"] = df["user_name_clean"].apply(lambda x: emoji_pattern.sub("", x) if x else None)

步骤七:跨字段与跨表交叉验证

这是最能体现分析师业务功底的一步。我通常会计算几个关键一致性指标:订单金额是否等于商品金额总和减优惠;下单时间是否早于支付时间;用户注册时间是否早于下单时间;同一用户在不同渠道是否有相同手机号。这些验证如果有异常,就应该把记录标记出来,而不是直接删掉。很多时候“异常”不是数据记错了,而是你的业务规则假设错了。比如一个用户在注册前下单,可能是因为线下渠道先建单再补会员卡,应该按真实业务逻辑更新规则。

# 跨字段校验示例:订单金额 = 商品金额 - 优惠金额 + 运费
amount_gap = (

df["item_total"] - df["discount_amount"] + df["shipping_fee"] - df["order_amount"]

)

gap_mask = amount_gap.abs() > 0.01

print("金额不平的订单数:", gap_mask.sum())

跨时间校验示例

time_conflict = df["created_at"] > df["payment_datetime"]

print("创建时间晚于支付时间的记录数:", time_conflict.sum())

步骤八:输出清洗报告

清洗报告是很多团队最容易忽略的交付物。它应该包含:原始数据规模、清洗后数据规模、每步规则处理的记录数、删除的记录明细、需人工确认的异常记录清单、以及剩余风险。报告不需要很长的分析,但一定要让下游使用方知道“这张表里还有哪些边界需要留意”,否则他们会把已清洗数据当成绝对正确数据。

summary = pd.DataFrame(cleaning_log)
summary.to_csv("cleaning_report.csv", index=False)

输出关键数据量

final_rows = len(df_cleaned)

print(f"清洗完成,最终数据 {final_rows} 行,删除 {len(df) - final_rows} 行")

数据分析入门数据清洗,基础清洗步骤

不同情况下的行动建议:按场景决定清洗策略,而不是照搬模板

  1. 一次性分析团队:以分析问题倒排清洗范围
    如果团队只有两三个人,分析目标是回答一个具体业务问题,就不要追求大而全的清洗。这时候应该先把“分析结论依赖哪些字段”列出来,只清洗和这些字段相关的部分。例如做复购分析,需要用户ID、订单号、支付时间、订单金额、退款状态。此时清洗重点就是订单去重、时间格式、退款状态编码和逻辑矛盾,用户昵称、收货地址等字段可以暂时不管。按这个思路,平均能将清洗时间压缩40%左右。
  2. 长期报表团队:建立月度数据质量基线
    报表分析师每个月都会跑同一套指标,最怕的就是“口径漂移”。我建议建立一张数据质量基线表,记录每月数据量的变动范围、主要字段的缺失率、异常率、重复率。只要某个月基线出现明显波动,就说明上游系统或业务规则有变化,需要及时排查。基线表相当于给数据质量装上“监控仪表盘”,能帮你把问题发现时间从周级别压缩到小时级别。
  3. 数据团队较完整的公司:规则入库 + 自动调度
    如果公司已有数据仓库或数据平台,清洗规则不应停留在本地Python脚本,而应固化成数据仓库的ETL任务。规则要写进配置中心,经过测试后发布到生产环境;数据质量检查结果自动生成告警;异常记录进入待清理表,由数据专员每周确认。到这个阶段,清洗就从“分析师个人经验”升级为“组织级数据资产”。
  4. 不同数据源的清洗重点

我整理了三种最常见的数据形态,它们适合的清洗手段差别很大。数据库表通常结构稳定,主要做业务逻辑校验;CSV导出最容易出现编码和类型问题,先做结构层;API回流数据通常有字段变更风险,需要做版本兼容;日志文件则需要处理大量重复和缺失。

数据分析入门数据清洗,基础清洗步骤

取舍与边界:清洗到什么程度才算“够用”

  1. 清洗的终点不是“零脏数据”,而是“分析结论稳定”
    我在真实项目里试过一种非常极端的方法:把能想到的清洗规则全加上,最后数据表干净得几乎没有一条记录需要人工确认。但实际分析结果和只做核心清洗的版本只在几个细分指标上有0.8%以内的差异。我们当时花了额外两倍时间,却只提升了无关紧要的精度。这个教训让我形成了一个判断标准:当你新增清洗规则后,主要分析结论的方向和大小没有显著变化,就说明清洗已经到达“够用”状态。不必追求把每个离群值都处理干净。
  2. 清洗规则的边际收益递减
    规则数量从5条增加到20条,异常检出率从62%提升到93%,效果非常明显。但从20条增加到60条,检出率只提升了6个百分点,而维护成本却翻了近4倍。我建议大多数业务分析团队把清洗规则控制在30条以内,超过这个量级后,每增加一条规则都要先质疑它是否真的能影响业务决策。如果你的问题是验证一个大的业务方向是否成立,那么80%的清洗时间都花在20%的关键字段上就够了;只有做精确到元级的财务对账,才需要更高密度的规则。
  3. 清洗不足与清洗过度,都会产生成本

很多人只看到了清洗不足的风险,却忽略了清洗过度同样危险。清洗不足会导致分析返工、口径对不上、决策依据不准确;清洗过度则可能误删有效数据、把真实业务波动当成异常抹平、并消耗大量人力在无价值的规则维护上。我在团队里引入了一个双向成本评估:每次清洗规则上线前,不仅要预估“能查出多少问题”,还要预估“可能误伤多少正常数据”。

数据分析入门数据清洗,基础清洗步骤

建议的处理边界

针对不同场景,我建议采用以下取舍标准。业务探索类分析可以只做结构层和关键值域层的清洗,保留一部分可控噪声;面向对外发布的经营分析报告,三层清洗都要完整执行,并补充交叉验证;实时数据管道则必须把规则自动化程度提高,但允许异常数据先进入沙箱区观察,而不是直接拦截。最终原则是:清洗的核心目的是提高决策置信度,而不是让数据表看起来完美

总结与下一步:让清洗成为你最值得投入的能力

数据清洗在大多数入门教程里被安排在第一课,却被安排得最敷衍。它不像可视化那样有即时反馈,也不像模型调参那样有技术挑战感。但在我参与的每一个真正产生业务价值的项目中,清洗阶段沉淀下来的“规则”最后都成了团队的数据知识库。与其说清洗是对数据做减法,不如说它在帮团队把业务边界梳理清楚。你拥有的最难替代的能力,不是跑通一个模型,而是能用15分钟判断:这张表里哪些数据可信、哪些不可信、为什么不可信。

如果你想立刻开始练习,我建议按下面三步走。第一,找一份你工作中真实使用的Excel或数据库导出数据,先备份一份,再按本文八个步骤逐项过一遍。第二,把每条清洗规则写成文本,同时标注它解决的是“结构层、值域层还是业务逻辑层”的问题。第三,对任何你处理过的异常值,保留“业务确认”的证据,不轻易删除任何一行。等你做完这三个动作,再来回头看清洗这件事,你会发现自己对业务的理解已经比大多数只跑模型的人深了一个层次。

常见问题解答(FAQ)

1. 数据清洗到底从哪一步开始?先处理缺失值还是先统一格式?

我刚开始学数据分析,拿到一份乱七八糟的Excel表,有空格、有文本数字、还有日期格式不统一。我看网上教程有的说先删空值,有的说先改格式,到底第一步该做什么?顺序错了会不会影响后面分析?

从我多次处理脏数据的经验看,第一步永远是先做数据备份和整体盘点,而不是急着处理缺失值或格式。因为清洗过程不可逆,没有备份一旦误删或覆盖,就只能重来。具体做法是复制原始文件另存为“原始数据_备份”,然后在副本上操作。

盘点的目的不是处理,而是搞清楚表里有多少行、多少列、每列的数据类型、缺失值占比、重复项数量。我习惯用Excel的筛选功能逐列看一遍,或者用Pandas的info()和describe()快速扫描。只有知道脏在哪,才能决定清洗顺序。

我的建议顺序是先备份和盘点,再统一数据格式,然后处理重复值,接着处理缺失值,最后处理异常值。统一格式要放在缺失值之前,因为很多缺失值其实是非标准写法,比如“N/A”、“-”、“unknown”,统一格式后才能真正判断哪些是空的。

2. 用Excel做数据清洗,最有效率的方式是什么?纯手工改太慢了

我目前只会用Excel,数据量大概一万多行,每一行都要手动改格式、删空行,弄了一个下午才弄完。我知道有函数能批量处理,但不知道哪些函数最常用,也想了解有没有更快的操作技巧?

一万多行在Excel里不算大,纯手工改确实最费时间。我建议优先掌握三个杀器:查找替换、分列、以及几个核心函数。查找替换不只是“把A改成B”,而是能处理换行符和前后空格,比如用Ctrl+H,在“查找内容”里按Alt+10输入换行符,就可以批量删除文本里的换行。分列功能常用于拆分日期和修正格式。

比如“20240101”这种文本日期,选中这一列,点“数据”里的“分列”,选固定宽度或分隔符,再指定目标格式为日期,就能一次性转成标准日期。比用DATE函数一个个拼要快得多。

函数方面,我常用的清洗函数是TRIM(去空格)、CLEAN(去不可见字符)、PROPER(标准化大小写)、TEXT(强制转成指定格式)、IFERROR(屏蔽错误值)。用这些函数创建辅助列,生成干净数据后,再粘贴成值,覆盖原列。

如果表里有几百个错别字或统一名称,还可以用条件格式和“定位条件”快速选中所有空值,然后一键填为“未知”。最后建议所有清洗操作都写进一个“清洗说明”工作表里,记录每一步做了什么、用了什么函数。这样几周后再拿到类似数据,直接复制流程,效率翻倍。

3. Python做数据清洗比Excel好在哪?什么场景下必须用Python?

我听说用Python清洗数据更自动化和可复现,但我是新手,只会一点pandas基础。像我这种只会Excel的人,有必要学Python清洗吗?还是说Excel处理不了的时候才需要Python?

我的判断是:如果你要处理的表超过十万行,或者每天都要处理同一结构的新数据,Python就是必学项;如果只是几千行的一次性数据,完全可以用Excel。Python的优势不是清洗一个文件更快,而是让整个流程可复用。

举一个我刚做过的真实案例:客户每周给我一份包含订单明细的CSV,大约20万行,里面日期格式有三种,金额有文本和数字混排,还有约5%的重复行。我用Excel打开光加载就卡了十几秒,筛选一次得等。

用Python写了一个脚本,只有二十多行:读取CSV,统一日期列,用to_numeric强制转换金额,用drop_duplicates去重,用切片检查异常值,最后输出清洗后的新文件,整个过程不到3秒。最适合用Python的场景有三类。第一类是数据量超过Excel百万行上限,或者超过十万行明显卡顿的。

第二类是清洗规则复杂,比如需要跨多列判断、正则表达式提取、按条件填充缺失值,Excel写公式会很痛苦。第三类是定时更新,比如每天从系统导出报表,清洗逻辑一样,只要换一下文件名就能运行。即使你还在学pandas,我建议从“重复代码”开始。

比如你发现自己在Excel里重复做同一套操作三次以上,就值得写一个Python函数。入门时先学会读取和写入CSV,然后用pandas的dropna、fillna、replace、astype这四个方法,就能覆盖80%的常见清洗需求。

4. 处理缺失值有哪些坑?是直接删除还是填充?判断标准是什么?

我每次处理缺失值都很纠结。看到网上有人说缺失多就直接删,有人说删除会丢信息,要用均值或者0填充。我试过用均值填充,结果发现做出来的图表很奇怪。到底该怎么判断什么时候删、什么时候填?

直接删除缺失值是最危险的操作。我见过一个同事处理销售数据时,把所有含有空格的字段都当成缺失值删了,结果把“销量为零”的正常记录全删掉了,导致当月销售额被低估30%。后来我们复盘才发现,那个表里空格代表“没有销售”,而真正的空单元格才是“缺失”。所以第一步永远是确认缺失的含义。我的判断标准有三条。

第一条,缺失比例小于5%且缺失值随机分布,可以直接删除该行;第二条,缺失比例超过30%但这一列对分析目标不重要,删除该列;第三条,缺失比例在5%~30%之间,最好不要直接删,而是用合理方式填充。填充方法也要看数据场景。

对连续数值型变量,比如收入、温度,中位数填充比均值更稳健,因为均值容易受异常值影响。对类别型变量,比如城市、产品类型,我习惯填“未知”类,而不是用众数硬填,否则会扭曲真实分布。

对时间序列数据,比如每日销售额,绝不能用全局均值填充,必须用前后值插值,比如ffill或线性插值,否则会制造出虚假的“阶梯突变”。最后还有一个容易踩的坑:填充后应该在数据里加一列“是否缺失”标记。比如你新增一列is_missing,记录这行原本是否有缺失,然后在建模时把这个标记作为特征输入。

这样既能保留缺失信息,又不会影响其他分析。

核心关键词

读者评论

蒋然

以前总觉得数据清洗就是删删补补,看完这篇文章才明白,清洗的核心是把业务口径搞清楚。文中那个退款单重复记账的例子太真实了,不处理的话复购率直接翻倍。作为入门者,确实应该把清洗当成分析的地基,而不是可有可无的准备动作。

廖雅楠

做过几年数据工作,非常认同“清洗占工时六成”的判断。三层清洗模型很实用,特别是业务逻辑层的检查,经常被忽略。另外把清洗规则沉淀成配置文件,变成可复用资产,这个做法值得推广。文章把很多踩坑经验都讲透了。

吕梓萱

作为业务方,平时最怕看到各部门对同一份数据各说各话。文中提到清洗后财务、运营、客服都能引用同一张表,不再争论口径,这正是我们需要的。数据质量是协作的基础,希望分析师们都能像这样把清洗做扎实,而不是只追求模型多炫。

免责申明:本文内容通过AI工具匹配关键字智能整合而成,仅供参考,帆软及九数云不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系jiushuyun@fanruan.com进行反馈,九数云收到您的反馈后将及时处理并反馈。
咨询方案
咨询方案二维码

扫码咨询方案

热门产品推荐

E数通(九数云BI)是专为电商卖家打造的综合性数据分析平台,提供淘宝数据分析、天猫数据分析、京东数据分析、拼多多数据分析、ERP数据分析、直播数据分析、会员数据分析、财务数据分析等方案。自动化计算销售数据、财务数据、绩效数据、库存数据,帮助卖家全局了解整体情况,决策效率高。

相关内容

查看更多
数据分析实战教程,抖音账号流量增长分析

数据分析实战教程,抖音账号流量增长分析

很多抖音账号的播放量已经从每条几千涨到几万,账号却没有明显增加有效粉丝;相反,有些视频只有两三万播放,却能带来 […]
数据分析实战家居案例,家居行业用户分析

数据分析实战家居案例,家居行业用户分析

数据分析实战家居案例,家居行业用户分析 我在2019年接手过一家中高端家居连锁品牌的数据分析项目,当时甲方市场 […]
数据分析实战金融案例,银行风控分析项目

数据分析实战金融案例,银行风控分析项目

2022年我参与的某城商行零售信贷风控分析项目,业务背景是贷款不良率连续两个季度上涨,从1.4%抬升到2.1% […]
数据分析实战满减案例,满减活动效果分析

数据分析实战满减案例,满减活动效果分析

数据分析实战满减案例,满减活动效果分析 2023年Q4,我接手了一家连锁烘焙品牌的满减活动复盘。品牌方在11月 […]
数据分析实战客户案例,客户价值提升分析

数据分析实战客户案例,客户价值提升分析

数据分析实战客户案例,客户价值提升分析 2022年11月,我接手了一个家居日用品DTC品牌的客户价值分析项目。 […]

让电商企业精细化运营更简单

整合电商全链路数据,用可视化报表辅助自动化运营

让决策更精准