第6章封面

分析之前先「进料」。数据可能躺在 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 生态现在的推荐答案;
  • HDF5pd.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_csvna_values/parse_dates/chunksize/usecols 是四大常用参数;读进来先验 head() + dtypes();嵌套 JSON 用 json_normalize;大数值数据用 Feather/Parquet/HDF5;API 三步走 requests → json → DataFrame