Python 数据异常的快速定位方法

7次阅读

pandas.dataframe.info() 是定位数据异常的首要工具,可查看字段类型、缺失值数量和内存占用;若数值列显示为Object,需用unique()检查是否混入空格或字符串;配合describe(include=”all”)、isna().sum()、duplicated().sum()和infer_dtype()可全面诊断脏数据。

Python 数据异常的快速定位方法

pandas.DataFrame.info() 看清数据“底细”

DataFrame.info() 不只是查行列数,它直接暴露字段类型、缺失值数量和内存占用——这是定位异常的第一把尺子。很多“计算结果不对”其实源于某列本该是 int64 却被读成 object(比如混入了空格或“N/A”字符串),导致后续 .sum().mean() 静默跳过。

  • 运行 df.info() 后重点关注 Non-NULL count 列:若明显少于 Total Count,说明有缺失;但更要盯住 Dtype 是否符合预期
  • 如果某数值列显示为 object,别急着转换,先用 df["col"].unique()[:10] 看前10个值,常会发现 " ""-""NULL" 这类伪装成数值的字符串
  • info() 默认不显示全部列,列太多时加参数 verbose=True,或直接用 df.info(memory_usage="deep") 查内存暴增是否由字符串列引起

df.describe(include="all") 横向比对各列分布

describe() 默认只统计数值列,加上 include="all" 才能同时看到分类列的 uniquetopfreq,这对发现脏数据特别有用。比如某用户ID列本应唯一,但 unique 值远小于行数,说明重复或格式混乱。

  • 数值列的 min/max 出现明显离群值(如年龄=999、金额=-1),大概率是占位符没清洗
  • 字符串列的 top 值如果频繁出现 "unknown""--",要确认业务上是否允许,否则后续 groupby 会把它们全归一类
  • 注意 countunique 的差值:若差值大,说明大量重复值,可能意味着上游系统写入异常或去重逻辑失效

df.isna().sum()df.duplicated().sum() 量化异常规模

光看“有没有”不够,得知道“有多少”。isna().sum() 返回每列缺失数,duplicated().sum() 返回完全重复行数——这两个数字决定你该清洗还是换数据源。

  • 缺失数占比超过 5% 的列,别急着用 fillna(),先查缺失是否集中在某时间段(如某天所有传感器断连),这种系统性缺失填了也没意义
  • duplicated() 默认检查所有列,但业务上可能只关心关键字段(如订单号+时间),这时改用 df.duplicated(subset=["order_id", "timestamp"])
  • 注意 df.duplicated(keep=False) 能标出所有重复项(包括首行),方便批量排查,而默认的 keep="first" 只标记后续重复行

pd.api.types.infer_dtype() 检查单列数据类型可信度

infer_dtype()dtype 更细粒度:它能告诉你一列是 Stringmixed-Integer 还是 floating,尤其适合发现“看似数字实则混杂”的列。

立即学习Python免费学习笔记(深入)”;

  • 对疑似问题列运行 pd.api.types.infer_dtype(df["col"]),若返回 mixedmixed-integer,基本可以确定存在非标准值
  • 它不修改数据,只诊断,所以可放心在生产环境小样本上跑,比如 pd.api.types.infer_dtype(df["price"].head(1000))
  • 返回 decimal 通常表示有 Decimal 对象混入,这会导致 numpy 运算报 TypeError: unsupported operand type(s)

真实数据里最麻烦的不是缺失或重复,而是那些“看起来正常却悄悄污染结果”的值——比如时间列里混进一个 "2023-02-30"to_datetime() 默认转成 NaT,但没人告诉你它在哪一行。这类问题必须结合多维度交叉验证,不能只信单一函数的输出。

text=ZqhQzanResources