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 数据读取与写入流程总览

Pandas 数据读取与写入流程 CSV 文件 Excel 文件 JSON 文件 其他格式 pd.read_csv() / pd.read_excel() / pd.read_json() / pd.json_normalize() DataFrame(内存中的表格数据) df.to_csv() / df.to_excel() / df.to_json() 💡 读取时关注编码与分隔符,写入时注意 index 与 encoding 参数

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'。