Pandas 数据导出
Pandas 提供了丰富的导出功能,可以将 DataFrame 导出为各种常见格式,包括 CSV、Excel、SQL 数据库、JSON 等。本节详细介绍各种导出方式的使用方法和注意事项。
导出为 CSV
CSV 是最通用的数据交换格式,导出会受环境默认编码影响,需要注意中文编码问题。
基本导出
实例
import pandas as pd
# 准备测试数据
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "赵六"],
"年龄": [25, 30, 28, 35],
"城市": ["北京", "上海", "广州", "深圳"],
"薪资": [12000, 15000, 11000, 18000]
})
# 最基本的导出(包含索引)
df.to_csv("output.csv")
# 不包含索引
df.to_csv("output.csv", index=False)
# 准备测试数据
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "赵六"],
"年龄": [25, 30, 28, 35],
"城市": ["北京", "上海", "广州", "深圳"],
"薪资": [12000, 15000, 11000, 18000]
})
# 最基本的导出(包含索引)
df.to_csv("output.csv")
# 不包含索引
df.to_csv("output.csv", index=False)
中文编码处理
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"城市": ["北京", "上海", "广州"]
})
# UTF-8 编码(推荐)
df.to_csv("output_utf8.csv", encoding="utf-8")
# UTF-8 with BOM(Excel 打开不乱码)
df.to_csv("output_utf8_bom.csv", encoding="utf-8-sig")
# GBK 编码(适合老旧系统)
df.to_csv("output_gbk.csv", encoding="gbk")
# 验证编码
import os
print("文件大小对比:")
for f in ["output_utf8.csv", "output_utf8_bom.csv", "output_gbk.csv"]:
print(f"{f}: {os.path.getsize(f)} bytes")
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"城市": ["北京", "上海", "广州"]
})
# UTF-8 编码(推荐)
df.to_csv("output_utf8.csv", encoding="utf-8")
# UTF-8 with BOM(Excel 打开不乱码)
df.to_csv("output_utf8_bom.csv", encoding="utf-8-sig")
# GBK 编码(适合老旧系统)
df.to_csv("output_gbk.csv", encoding="gbk")
# 验证编码
import os
print("文件大小对比:")
for f in ["output_utf8.csv", "output_utf8_bom.csv", "output_gbk.csv"]:
print(f"{f}: {os.path.getsize(f)} bytes")
导出选项详解
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 指定分隔符(默认是逗号)
df.to_csv("output.tsv", sep="\t") # TSV 格式
# 不写入表头
df.to_csv("output.csv", header=False)
# 自定义列名(当 header=False 时)
df.to_csv("output.csv", header=False, columns=["姓名", "年龄"])
# 只导出特定列
df.to_csv("output.csv", columns=["姓名"]) # 只导出"姓名"列
# 缺失值处理
import numpy as np
df_with_na = pd.DataFrame({
"A": [1, 2, np.nan, 4],
"B": ["a", None, "c", "d"]
})
df_with_na.to_csv("output.csv", na_rep="NULL") # 指定缺失值表示形式
# 浮点数精度
df = pd.DataFrame({"value": [1.23456789, 2.3456789]})
df.to_csv("output.csv", float_format="%.2f") # 保留2位小数
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 指定分隔符(默认是逗号)
df.to_csv("output.tsv", sep="\t") # TSV 格式
# 不写入表头
df.to_csv("output.csv", header=False)
# 自定义列名(当 header=False 时)
df.to_csv("output.csv", header=False, columns=["姓名", "年龄"])
# 只导出特定列
df.to_csv("output.csv", columns=["姓名"]) # 只导出"姓名"列
# 缺失值处理
import numpy as np
df_with_na = pd.DataFrame({
"A": [1, 2, np.nan, 4],
"B": ["a", None, "c", "d"]
})
df_with_na.to_csv("output.csv", na_rep="NULL") # 指定缺失值表示形式
# 浮点数精度
df = pd.DataFrame({"value": [1.23456789, 2.3456789]})
df.to_csv("output.csv", float_format="%.2f") # 保留2位小数
导出为 Excel
Excel 格式适合人工查看和编辑,但大文件导出较慢。
安装依赖
pip install openpyxl xlwt
基本导出
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"城市": ["北京", "上海", "广州"],
"薪资": [12000, 15000, 11000]
})
# 导出为 Excel(.xlsx 格式,需要 openpyxl)
df.to_excel("output.xlsx", index=False)
# 导出为老版本 .xls 格式(需要 xlwt)
df.to_excel("output.xls", index=False)
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"城市": ["北京", "上海", "广州"],
"薪资": [12000, 15000, 11000]
})
# 导出为 Excel(.xlsx 格式,需要 openpyxl)
df.to_excel("output.xlsx", index=False)
# 导出为老版本 .xls 格式(需要 xlwt)
df.to_excel("output.xls", index=False)
多 Sheet 导出
实例
import pandas as pd
# 创建多个 DataFrame
df1 = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df2 = pd.DataFrame({"C": [7, 8, 9], "D": [10, 11, 12]})
# 导出到同一个 Excel 的不同 Sheet
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
df1.to_excel(writer, sheet_name="Sheet1", index=False)
df2.to_excel(writer, sheet_name="Sheet2", index=False)
print("多 Sheet 导出成功")
# 创建多个 DataFrame
df1 = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df2 = pd.DataFrame({"C": [7, 8, 9], "D": [10, 11, 12]})
# 导出到同一个 Excel 的不同 Sheet
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
df1.to_excel(writer, sheet_name="Sheet1", index=False)
df2.to_excel(writer, sheet_name="Sheet2", index=False)
print("多 Sheet 导出成功")
格式化导出
实例
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
# 创建 DataFrame
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"薪资": [12000, 15000, 11000]
})
# 使用 ExcelWriter 进行更精细的控制
with pd.ExcelWriter("output_formatted.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="员工信息", index=False)
# 获取工作表
worksheet = writer.sheets["员工信息"]
# 设置列宽
worksheet.column_dimensions["A"].width = 15
worksheet.column_dimensions["B"].width = 10
worksheet.column_dimensions["C"].width = 12
# 冻结首行
worksheet.freeze_panes = "A2"
print("格式化导出完成")
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
# 创建 DataFrame
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"薪资": [12000, 15000, 11000]
})
# 使用 ExcelWriter 进行更精细的控制
with pd.ExcelWriter("output_formatted.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="员工信息", index=False)
# 获取工作表
worksheet = writer.sheets["员工信息"]
# 设置列宽
worksheet.column_dimensions["A"].width = 15
worksheet.column_dimensions["B"].width = 10
worksheet.column_dimensions["C"].width = 12
# 冻结首行
worksheet.freeze_panes = "A2"
print("格式化导出完成")
导出为数据库
可以直接将 DataFrame 导出到 SQL 数据库,详见《Pandas 读取 SQL 数据库》一章。
实例
import pandas as pd
from sqlalchemy import create_engine
# 创建内存数据库
engine = create_engine("sqlite:///output.db")
# 准备数据
df = pd.DataFrame({
"name": ["张三", "李四", "王五"],
"age": [25, 30, 28],
"city": ["北京", "上海", "广州"]
})
# 导出到数据库
# if_exists: 'fail'(默认) / 'replace' / 'append'
df.to_sql("users", con=engine, if_exists="replace", index=False)
print("导出到数据库成功")
from sqlalchemy import create_engine
# 创建内存数据库
engine = create_engine("sqlite:///output.db")
# 准备数据
df = pd.DataFrame({
"name": ["张三", "李四", "王五"],
"age": [25, 30, 28],
"city": ["北京", "上海", "广州"]
})
# 导出到数据库
# if_exists: 'fail'(默认) / 'replace' / 'append'
df.to_sql("users", con=engine, if_exists="replace", index=False)
print("导出到数据库成功")
导出为 JSON
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28]
})
# 不同 orient 格式
df.to_json("records.json", orient="records", force_ascii=False, indent=2)
df.to_json("index.json", orient="index", force_ascii=False)
df.to_json("columns.json", orient="columns", force_ascii=False)
# JSON Lines 格式(每行一个 JSON 对象,适合日志)
df.to_json("lines.json", orient="records", lines=True, force_ascii=False)
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28]
})
# 不同 orient 格式
df.to_json("records.json", orient="records", force_ascii=False, indent=2)
df.to_json("index.json", orient="index", force_ascii=False)
df.to_json("columns.json", orient="columns", force_ascii=False)
# JSON Lines 格式(每行一个 JSON 对象,适合日志)
df.to_json("lines.json", orient="records", lines=True, force_ascii=False)
导出为其他格式
导出为 HTML
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 导出为 HTML 表格
df.to_html("output.html", index=False)
# 添加样式
df.to_html(
"output_styled.html",
index=False,
border=2,
classes=["table", "table-striped"] # 添加 CSS 类
)
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 导出为 HTML 表格
df.to_html("output.html", index=False)
# 添加样式
df.to_html(
"output_styled.html",
index=False,
border=2,
classes=["table", "table-striped"] # 添加 CSS 类
)
导出为 Markdown
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28]
})
# 导出为 Markdown 表格
print(df.to_markdown(index=False))
# 输出:
# | 姓名 | 年龄 |
# | ---- | ---- |
# | 张三 | 25 |
# | 李四 | 30 |
# | 王五 | 28 |
# 保存到文件
with open("output.md", "w") as f:
f.write(df.to_markdown(index=False))
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28]
})
# 导出为 Markdown 表格
print(df.to_markdown(index=False))
# 输出:
# | 姓名 | 年龄 |
# | ---- | ---- |
# | 张三 | 25 |
# | 李四 | 30 |
# | 王五 | 28 |
# 保存到文件
with open("output.md", "w") as f:
f.write(df.to_markdown(index=False))
导出为 LaTeX
实例
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 导出为 LaTeX 表格
print(df.to_latex(index=False))
# 输出 LaTeX 表格代码
df = pd.DataFrame({
"姓名": ["张三", "李四"],
"年龄": [25, 30]
})
# 导出为 LaTeX 表格
print(df.to_latex(index=False))
# 输出 LaTeX 表格代码
导出为 Pickle
实例
import pandas as pd
df = pd.DataFrame({
"A": [1, 2, 3],
"B": ["a", "b", "c"]
})
# 导出为 Pickle(保持数据类型)
df.to_pickle("data.pkl")
# 压缩格式
df.to_pickle("data.pkl.gz", compression="gzip")
print("Pickle 导出完成")
df = pd.DataFrame({
"A": [1, 2, 3],
"B": ["a", "b", "c"]
})
# 导出为 Pickle(保持数据类型)
df.to_pickle("data.pkl")
# 压缩格式
df.to_pickle("data.pkl.gz", compression="gzip")
print("Pickle 导出完成")
大数据量导出
导出大数据量时需要注意内存和性能问题。
实例
import pandas as pd
# 大数据量导出建议:
# 1. 使用 chunksize 分批写入
df = pd.DataFrame({"a": range(1000000), "b": range(1000000)})
# CSV 分块写入
csv_path = "large_output.csv"
df.to_csv(csv_path, index=False, chunksize=100000)
# 2. 使用更高效的格式(Parquet)
df.to_parquet("large_output.parquet", index=False)
# 3. 使用压缩格式减少 IO
df.to_csv("large_output.csv.gz", index=False, compression="gzip")
print("大数据量导出完成")
# 大数据量导出建议:
# 1. 使用 chunksize 分批写入
df = pd.DataFrame({"a": range(1000000), "b": range(1000000)})
# CSV 分块写入
csv_path = "large_output.csv"
df.to_csv(csv_path, index=False, chunksize=100000)
# 2. 使用更高效的格式(Parquet)
df.to_parquet("large_output.parquet", index=False)
# 3. 使用压缩格式减少 IO
df.to_csv("large_output.csv.gz", index=False, compression="gzip")
print("大数据量导出完成")
常见问题与注意事项
1、Excel 打开 CSV 文件乱码
使用 utf-8-sig 编码导出,Excel 可以正确识别中文。
2、导出大数据时内存不足
使用 chunksize 参数分批写入,或使用 Parquet 格式替代 CSV。
3、日期时间格式丢失
CSV 导出时会转换为字符串,可以指定 date_format 参数控制格式。
4、导出到数据库类型不匹配
可以使用 dtype 参数显式指定列类型。
日常数据分析推荐使用 Parquet 格式,它具有高压缩比、快速读写、保持数据类型等优点。只有在需要人工查看或分享时才使用 Excel 或 CSV 格式。
