本节摘要:SOURCE 3.1 以 Pandas read_csv/read_excel 为主线,配合 head/info/describe 三角摸底;超大 CSV 用 Dask read_csv + compute()。本节保留原文代码路径,并补充 dtypes、isnull、unique 与 hist 初探清单。
阅读完本节,你应当能够:
SOURCE 示例:
import pandas as pd df = pd.read_csv("data.csv") # df = pd.read_excel("data.xlsx") print(df.head()) print(df.info()) print(df.describe())
| 方法 | 回答的问题 |
|---|---|
| head() | 长什么样、分隔是否正确 |
| info() | 行数、非空数、dtype、内存 |
| describe() | 数值列分布(计数/均值/分位) |
读 JSON/SQL 时 SOURCE 亦提及 read_json、read_sql_query——Notebook 里先 %pwd 确认工作目录,再 read,避免 FileNotFoundError。
SOURCE:Pandas 全量进内存会爆;Dask 分块并行:
import dask.dataframe as dd ddf = dd.read_csv("large_data.csv") print(ddf.head()) print(ddf.describe().compute())
.compute() 触发实际计算——探索阶段只对 head/describe 等聚合调用 compute,别对整个大表无脑 materialize。
首屏 Markdown 格记录「发现」:如「age 有 3% 缺失」「category 有未知级别 UNKNOWN」——给清洗节交接。

SOURCE 虽未逐条列参,工程上常一起设:
| 参数 | 用途 |
|---|---|
| encoding | 中文 CSV 试 utf-8-sig/gbk |
| parse_dates | 直接解析日期列 |
| dtype | 预指定类型省内存 |
| nrows | 仅读前 N 行试 schema |
⚠️ 常见坑:Excel 日期序列被读成 float——用 parse_dates 或 read_excel 的 date_parser。
💡 关键直觉:EDA 前 5 分钟只回答「数据能不能信」——行数、缺失、类型、明显离群,别急着建模。
下一节 3.2 数据清洗与转换 处理 missing 与类型。
import pandas as pd df = pd.read_csv( "sales_2024.csv", encoding="utf-8-sig", # 中文表头常见 parse_dates=["order_date"], dtype={"store_id": "str"}, # 门店编号保留前导零 ) print(df.shape) print(df.head(3))
读入后建议按固定顺序检查四件事:
# 类别列的取值全景 for col in df.select_dtypes(include="object").columns: print(col, df[col].unique()[:10]) # 数值列的分布速览 df.describe().T
这段代码输出两类信息:类别列的取值边界(发现拼写不一致的标签),数值列的分位数(发现极端离群)。把结果贴进 Markdown 格,作为后续清洗的交接文档。
只有"单表超出内存"才值得引入 Dask。经验阈值:列数不多、行数千万级、几十 GB 时,Dask 收益明显;几百万行以内,Pandas 加 usecols 裁剪 + chunksize 通常就够。过早引入 Dask 会让简单分析变复杂,也会失去 pandas 生态里大部分第三方兼容。
%pwd 显示的是启动时的工作目录,不是文件所在目录。pd.read_csv("data.csv") 的路径相对 %pwd 解析,路径不对先 %pwd 确认,不要盲目怀疑文件不存在。把列名、dtype、缺失、唯一值整理成一张表,贴到 Notebook 首部 Markdown 格,是整份分析的地图。后续每一节转换都对照这张表检查"哪列被动了、变什么类型了",能防止清洗过程悄悄丢掉字段。
schema = pd.DataFrame({ "dtype": df.dtypes, "missing": df.isnull().sum(), "n_unique": df.nunique(), }) schema
探索阶段不要急着删离群值,先标出来:df["is_outlier"] = ... 打标记。是否剔除、用什么阈值,留给建模前的决策环节。探索期的任务是把"数据里发生了什么"讲清楚,而不是提前下结论。
每次读取数据后,用下面五步快速体检,全程不超过两分钟:看 shape 是否符合预期;看 dtypes 是否把日期、编号读成 object;看缺失列与缺失比例;看类别列的取值集合是否干净;看 describe 的数值范围是否在合理区间。
把五步结果写进一个 Markdown 格,这份"体检报告"就是后续清洗与建模的基线。数据每次重读或换源时,对照基线一查就知道有没有引入新问题。
同一份数据从 CSV、数据库、API 三个渠道读进来,列名大小写、时间格式、缺失标记(空字符串还是 NaN)可能都不一样。探索阶段就把三者的 schema 差异记录下来,统一列名与类型后再合并,能避免后期莫名其妙的 join 结果。
大文件反复测试时,先 nrows=5000 读一小块验证列名与类型,确认没问题再全量读。另一个常用技巧是按需取列:usecols=["id", "price", "date"] 只读必要列,内存和读盘时间都能显著下降。这两招都不影响最终结果,只是让探索阶段更轻快。
每次数据摸底后,把"发现了什么"浓缩成三到五条写在 Markdown 格:表有多大规模、哪些列有缺失、哪些类别标签不统一、有没有明显离群。这份存档在换人接手或数月后回看时,能快速恢复上下文,远比重新跑一遍代码高效。