分析之前先「进料」。数据可能躺在 CSV、Excel、JSON、网页、数据库里——第 6 章就是海关与码头,教你把各种形态的数据平安运进 DataFrame,再把结果体面地送出去。
📄 read_csv:用得最多的一个函数
文本格式解析的核心是 pd.read_csv(还有 read_table)。它能自动猜分隔符、认表头、找索引列,但真正体现功力的是参数组合拳:
pd.read_csv("examples/ex1.csv") # 自动表头
pd.read_csv("examples/ex2.csv", header=None) # 源文件没表头
pd.read_csv("examples/ex2.csv",
names=["a", "b", "c", "d", "message"],
index_col="message") # 指定列名 + 用某列做行索引
# 处理脏东西的四件套
pd.read_csv("file.csv", sep="|", # 分隔符
na_values=["NULL", "NA", "-999"], # 这些字符串算缺失
skiprows=[0, 2], # 跳过第1、3行
thousands=".", # 千分位
parse_dates=["date"]) # 自动转日期
⚠️ 经验法则:读进来的第一件事是 df.head() + df.dtypes()——类型猜错(比如把日期读成字符串)是后续一切诡异 bug 的源头。
大文件:分块读
一个 10GB 的 CSV 直接 read 会撑爆内存。书里的方案是迭代分块:
chunks = pd.read_csv("big.csv", chunksize=1000) # 每次 1000 行
tot = pd.Series([], dtype="float64")
for piece in chunks:
tot = tot.add(piece["key"].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False)[:10] # 流式统计 Top10
# 或者只读需要的列:read_csv(..., usecols=["key","value"])
写出去
df.to_csv("out.csv", index=False, na_rep="NULL") # 不写行索引
import sys
df.to_csv(sys.stdout, sep="|") # 顺便打印看效果
🌐 JSON:互联网的通用语
import json
obj = """{"name": "Wes", "jobs": [{"title": "author"}, {"title": "dev"}]}"""
data = json.loads(obj) # str → Python 对象
json.dumps(data) # Python 对象 → str
# 嵌套结构一键展平成表
pd.json_normalize(data, "jobs") # jobs 数组变成两行 DataFrame
json_normalize 是处理真实 API 返回的嵌套 JSON 的神器——把「对象的列表」直接拍成「行的列表」。
网页抓取:read_html
tables = pd.read_html("fdic_failed_bank_list.html") # 返回所有 <table>
failures = tables[0]
failures.head()
⚠️ read_html 需要 lxml + html5lib;抓别人网站前先确认 robots 与条款。
📊 Excel / HDF5 / 二进制格式
xlsx = pd.ExcelFile("examples/ex1.xlsx") # 先开文件对象
pd.read_excel(xlsx, "Sheet1") # 再读 sheet
frame.to_excel("out.xlsx", sheet_name="data") # 写 Excel
大型数值数据(百万行级)推荐二进制路线,快 50~100 倍:
- pickle / to_pickle:Python 原生序列化,方便但长期存储慎用(版本依赖);
- Feather / Parquet:跨语言列式格式,pandas 生态现在的推荐答案;
- HDF5(
pd.read_hdf/to_hdf):适合「单个大文件、按层级存多份数据集」,还支持增量查询。
🔗 Web API 与数据库
书里的标准 API 模板——requests 拿 JSON → 转 DataFrame:
import requests
url = "https://api.github.com/repos/pandas-dev/pandas/issues"
resp = requests.get(url); resp.raise_for_status()
issues = pd.DataFrame(resp.json()) # 立刻是一张表
issues["comments"], issues["title"]
数据库用 SQLAlchemy 连接串 + read_sql:
import sqlite3
con = sqlite3.connect("mydata.sqlite")
pd.read_sql("SELECT * FROM test", con) # SQL 结果直接进表
📌 本章小结:
read_csv的na_values/parse_dates/chunksize/usecols是四大常用参数;读进来先验head()+dtypes();嵌套 JSON 用json_normalize;大数值数据用 Feather/Parquet/HDF5;API 三步走requests → json → DataFrame。