数据探索与概览:用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。一开始以为是正常的大单,后来一查——是系统录入错误。所以,max 和 min 一定要结合业务逻辑去判断。
第三步:对非数值列单独描述
供应链数据里,很多关键信息是文本或类别,比如“供应商名称”、“运输方式”、“产品类别”。
.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'])
这套流程跑下来,你对数据的整体认知就有了。说白了,就是知道数据“长什么样、有没有病、哪里需要治”。
知识体系总览
下面这张图,帮你把本章的核心逻辑串起来:
几个实用小技巧
最后分享几个我平时常用的技巧:
- 只看前几行:
df.head(10)快速扫一眼数据长啥样。我习惯先看5行,再看10行。 - 只看后几行:
df.tail(5)检查数据末尾有没有异常。 - 查看列名:
df.columns.tolist()把所有列名列出来,方便后续操作。 - 查看唯一值:
df['供应商'].unique()看看有多少家供应商。
我的习惯:每次拿到新数据,我都会先跑一遍 .info() 和 .describe(),然后把结果截图保存。为什么?因为后续做特征工程时,经常需要回头对照原始数据的统计信息。你想想看,如果连原始数据长啥样都不清楚,后面做的特征工程就是空中楼阁。
数据探索与概览,说白了就是给数据做一次“体检”。
体检报告出来了,你才知道哪些地方需要“治疗”——也就是数据清洗和特征工程。
嗯,下一节我们就要开始动手“治病”了。
公众号:蓝海资料掘金营,微信deep3321