教程 / Python3 / Pandas 数据导出

Pandas 数据导出

Pandas 数据导出 Pandas 提供了丰富的导出功能,可以将 DataFrame 导出为各种常见格式,包括 CSV、Excel、SQL 数据库、JSON 等。本节详细介绍各种导出方式的使用方法和注意事项。 导出为

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)

中文编码处理

实例

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")

导出选项详解

实例

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位小数

导出为 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)

多 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 导出成功")

格式化导出

实例

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("格式化导出完成")

导出为数据库

可以直接将 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("导出到数据库成功")

导出为 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)

导出为其他格式

导出为 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 类
)

导出为 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))

导出为 LaTeX

实例

import pandas as pd

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 导出完成")

大数据量导出

导出大数据量时需要注意内存和性能问题。

实例

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、Excel 打开 CSV 文件乱码

使用 utf-8-sig 编码导出,Excel 可以正确识别中文。

2、导出大数据时内存不足

使用 chunksize 参数分批写入,或使用 Parquet 格式替代 CSV。

3、日期时间格式丢失

CSV 导出时会转换为字符串,可以指定 date_format 参数控制格式。

4、导出到数据库类型不匹配

可以使用 dtype 参数显式指定列类型。

日常数据分析推荐使用 Parquet 格式,它具有高压缩比、快速读写、保持数据类型等优点。只有在需要人工查看或分享时才使用 Excel 或 CSV 格式。