数据探索与概览:用Pandas摸清数据底细

拿到一份供应链数据,别急着做清洗,也别急着建模。

我个人的习惯是——先花10分钟,把数据“摸一遍”。

这就像你拿到一堆零件,总得先看看有多少、长啥样、有没有明显破损吧?

数据探索与概览,就是干这个的。

核心目标:用最少的时间,掌握数据的全貌、结构、质量。

第一步:数据维度与类型检查

先问自己三个问题:

  • 数据有多少行?多少列?
  • 每列是什么类型?数值、文本、还是日期?
  • 有没有明显不对劲的地方?

Pandas里最直接的工具就是 .shape.info()

import pandas as pd

# 读取供应链数据
df = pd.read_csv('supply_chain_data.csv')

# 看一眼维度
print('数据维度:', df.shape)

# 详细检查每列信息
df.info()

.shape 返回一个元组,比如 (5000, 25),意思是有5000行、25列。

嗯,这里要注意:行数代表样本量,列数代表特征数。供应链数据里,行数太少可能不够建模,列数太多可能带来冗余。

.info() 就更实用了。它会告诉你:

  • 每列的名称
  • 每列的非空值数量
  • 每列的数据类型(dtype)
  • 内存占用情况

我的经验:我在项目中遇到过,某供应商的“交货日期”列被读成了字符串。用 .info() 一眼就发现了——本该是 datetime 类型,结果显示 object。这种坑,早发现早处理。

第二步:describe() 函数——数值列的“体检报告”

.describe() 是我用得最多的函数之一。它自动对数值列做统计摘要。

# 对数值列做统计描述
df.describe()

输出结果会包含:

统计量 含义 供应链场景举例
count 非空值数量 5000条订单记录中,有4800条有“实际到货日期”
mean 平均值 平均采购单价是120元
std 标准差 交货周期波动很大,标准差达到15天
min 最小值 最低库存量是0——说明有缺货记录
25% 第一四分位数 25%的订单金额低于5000元
50% 中位数 一半的订单在7天内完成
75% 第三四分位数 75%的订单金额低于20000元
max 最大值 最大库存周转天数达到120天——明显异常

避坑指南:我曾经在分析某零售供应链数据时,直接用 .describe() 看“订单金额”列,发现最大值是9999999。一开始以为是正常的大单,后来一查——是系统录入错误。所以,maxmin 一定要结合业务逻辑去判断。

第三步:对非数值列单独描述

供应链数据里,很多关键信息是文本或类别,比如“供应商名称”、“运输方式”、“产品类别”。

.describe() 默认只处理数值列。但你可以加个参数:

# 对类别列做统计
df.describe(include=['object'])

它会返回:

  • count:非空值数量
  • unique:唯一值数量(比如有多少家供应商)
  • top:出现频率最高的值
  • freq:最高频率值出现的次数

举个例子:如果“运输方式”列显示 top 是“陆运”,freq 是 3200,说明大部分订单走陆运。这个信息对后续做物流优化很有用。

第四步:数据概览的“组合拳”

我个人习惯把这几个函数组合起来用,形成一套“数据体检流程”:

# 我的数据概览三板斧
print("="*50)
print("1. 数据维度")
print("="*50)
print(f"行数: {df.shape[0]}, 列数: {df.shape[1]}")

print("\n" + "="*50)
print("2. 列信息概览")
print("="*50)
df.info()

print("\n" + "="*50)
print("3. 数值列统计摘要")
print("="*50)
df.describe()

print("\n" + "="*50)
print("4. 类别列统计摘要")
print("="*50)
df.describe(include=['object'])

这套流程跑下来,你对数据的整体认知就有了。说白了,就是知道数据“长什么样、有没有病、哪里需要治”。

知识体系总览

下面这张图,帮你把本章的核心逻辑串起来:

数据探索与概览:核心流程 第一步:维度检查 .shape / .info() 第二步:数值列统计 .describe() 第三步:类别列统计 .describe(include=['object']) 输出结果 数据维度 行数、列数、数据类型 数值统计摘要 均值、标准差、分位数、极值 类别统计摘要 唯一值数量、最高频值、频次 缺失值检测 通过 info() 的 non-null 列判断 最终目标:快速识别数据质量、分布特征、潜在问题

几个实用小技巧

最后分享几个我平时常用的技巧:

  • 只看前几行:df.head(10) 快速扫一眼数据长啥样。我习惯先看5行,再看10行。
  • 只看后几行:df.tail(5) 检查数据末尾有没有异常。
  • 查看列名:df.columns.tolist() 把所有列名列出来,方便后续操作。
  • 查看唯一值:df['供应商'].unique() 看看有多少家供应商。

我的习惯:每次拿到新数据,我都会先跑一遍 .info().describe(),然后把结果截图保存。为什么?因为后续做特征工程时,经常需要回头对照原始数据的统计信息。你想想看,如果连原始数据长啥样都不清楚,后面做的特征工程就是空中楼阁。

数据探索与概览,说白了就是给数据做一次“体检”。

体检报告出来了,你才知道哪些地方需要“治疗”——也就是数据清洗和特征工程。

嗯,下一节我们就要开始动手“治病”了。


公众号:蓝海资料掘金营,微信deep3321