3. Pandas 基础:数据读取与写入
在数据分析流程中,第一步往往是将外部数据加载到内存。Pandas 提供了简洁且高性能的 I/O 接口,支持 CSV、Excel、JSON、SQL、Parquet 等数十种格式。本章聚焦最常用的三种数据源:CSV、Excel 和 JSON,并讲解对应的导出方法。
💡 核心原则:读取时关注编码、分隔符、表头;写入时关注索引处理、列选择、文件覆盖。
3.1 读取 CSV 文件
CSV(逗号分隔值)是最通用的表格数据格式。Pandas 使用 pd.read_csv() 读取,参数灵活。
3.1.1 基本读取
import pandas as pd
# 读取本地 CSV 文件
df = pd.read_csv('sales_data.csv')
print(df.head())
3.1.2 常用参数详解
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
filepath_or_buffer |
str / path | 文件路径或 URL | './data.csv' |
sep |
str | 分隔符,默认 ',' |
sep=';' |
header |
int / None | 指定第几行为列名;None 表示无表头 |
header=0 |
encoding |
str | 文件编码,常用 'utf-8' / 'gbk' |
encoding='utf-8' |
dtype |
dict | 指定列的数据类型 | dtype={'id': str} |
parse_dates |
list / bool | 自动解析日期列 | parse_dates=['date'] |
nrows |
int | 只读取前 N 行(用于预览) | nrows=100 |
3.1.3 实战:处理中文 CSV
# 中文 CSV 常见编码问题
df = pd.read_csv('订单数据.csv', encoding='gbk', sep=',')
print(df.columns.tolist())
⚠️ 常见错误:
UnicodeDecodeError 通常由编码不匹配引起。尝试 encoding='gbk'、'utf-8-sig' 或 'latin1'。
3.2 读取 Excel 文件
Excel 文件可能包含多个工作表(Sheet)。Pandas 通过 pd.read_excel() 读取,依赖 openpyxl 或 xlrd 引擎。
3.2.1 读取单个 Sheet
# 读取第一个 Sheet
df = pd.read_excel('report.xlsx')
# 指定 Sheet 名称
df = pd.read_excel('report.xlsx', sheet_name='销售明细')
3.2.2 读取多个 Sheet
# 返回 dict,key 为 Sheet 名
sheets = pd.read_excel('report.xlsx', sheet_name=None)
for name, df in sheets.items():
print(f"Sheet: {name}, 行数: {len(df)}")
3.2.3 参数对比
| 参数 | 说明 | 示例 |
|---|---|---|
sheet_name |
Sheet 名称或索引(0 开始) | sheet_name='Sheet1' |
header |
列名所在行 | header=0 |
usecols |
读取指定列 | usecols='A:C' |
dtype |
列类型字典 | dtype={'金额': float} |
engine |
解析引擎 | engine='openpyxl' |
3.3 读取 JSON 文件
JSON 是 Web API 和日志的常见格式。Pandas 提供 pd.read_json(),支持多种 JSON 结构。
3.3.1 读取标准 JSON
# 读取 JSON 文件(记录格式)
df = pd.read_json('users.json')
# 从字符串读取
json_str = '[{"name":"Alice","age":30},{"name":"Bob","age":25}]'
df = pd.read_json(json_str)
3.3.2 处理嵌套 JSON
# 使用 json_normalize 展开嵌套字段
from pandas import json_normalize
data = [
{"id": 1, "info": {"city": "北京", "dept": "技术"}},
{"id": 2, "info": {"city": "上海", "dept": "市场"}}
]
df = json_normalize(data)
print(df.columns.tolist()) # ['id', 'info.city', 'info.dept']
3.4 数据写入与导出
处理完数据后,需要将结果持久化。Pandas 提供对应的 to_* 方法。
3.4.1 导出为 CSV
# 基本导出
df.to_csv('output.csv', index=False)
# 指定编码、分隔符
df.to_csv('output.csv', index=False, encoding='utf-8-sig', sep=',')
3.4.2 导出为 Excel
# 单个 Sheet
df.to_excel('output.xlsx', sheet_name='数据', index=False)
# 多个 Sheet(使用 ExcelWriter)
with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
df1.to_excel(writer, sheet_name='销售', index=False)
df2.to_excel(writer, sheet_name='库存', index=False)
3.4.3 导出为 JSON
# 记录格式(每行一个对象)
df.to_json('output.json', orient='records', force_ascii=False)
# 列格式
df.to_json('output.json', orient='columns', force_ascii=False)
3.4.4 导出参数速查
| 方法 | 关键参数 | 说明 |
|---|---|---|
to_csv() |
index, encoding, sep |
CSV 导出,注意 utf-8-sig 解决 Excel 乱码 |
to_excel() |
sheet_name, index |
Excel 导出,支持多 Sheet |
to_json() |
orient, force_ascii |
JSON 导出,orient='records' 最常用 |
3.5 数据读取与写入流程总览
3.6 综合案例:从 CSV 读取 → 处理 → 导出 Excel
import pandas as pd
# 1. 读取 CSV
df = pd.read_csv('sales_raw.csv', encoding='utf-8')
# 2. 数据清洗(示例)
df['amount'] = df['amount'].fillna(0)
df['date'] = pd.to_datetime(df['date'])
# 3. 分组汇总
summary = df.groupby('category')['amount'].sum().reset_index()
# 4. 导出为 Excel(多 Sheet)
with pd.ExcelWriter('sales_report.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='原始数据', index=False)
summary.to_excel(writer, sheet_name='汇总数据', index=False)
print("✅ 报表已生成:sales_report.xlsx")
📌 关键点回顾:
- 读取:
pd.read_csv()注意encoding;pd.read_excel()注意sheet_name;pd.read_json()注意orient。 - 写入:
to_csv(index=False)避免多余索引列;to_excel()配合ExcelWriter实现多 Sheet。 - 编码:中文环境推荐
encoding='utf-8-sig'或'gbk'。