You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将共享标识符的两个DataFrame每行导出为单独PDF文件?

按行生成包含两个DataFrame对应行的独立PDF文件

我需要为每行数据生成单独的PDF文件,每个PDF仅包含两个DataFrame中对应行的记录,两个DataFrame通过country和number两个唯一标识符匹配。

示例数据

第一个DataFrame(参与数据):

country number  Particip    EvoParticip 
    CZ      2       731658.0   26.1
    CZ      4       696739.0   -13.2
    CZ      5       580834.0   -10.5

第二个DataFrame(交易数据):

country number  Trans      EvoTrans
    CZ      2       1656171.0  12.9
    CZ      4       16265.0    26.0
    CZ      5       17302.0    26.2

期望输出

每个PDF对应一对匹配行,例如编号为CZ-2的PDF内容如下:

country number  Particip    EvoParticip 
    CZ      2       731658.0    26.1

    country number  Trans      EvoTrans
    CZ      2       1656171.0  12.9

当前问题

目前仅能生成包含完整DataFrame的单个PDF,现有代码如下:

figs = [fig,fig1]
fig
the_table = ax.table(cellText=df2.values,colLabels=df2.columns,loc='center')

fig1
the_table = ax.table(cellText=df3.values,colLabels=df3.columns,loc='center')

with PdfPages("foo.pdf") as pp:
    for figy in figs:
        pp.savefig(figy, bbox_inches='tight')

解决方案

核心思路:先确保两个DataFrame的行严格匹配,再循环每一行创建独立画布,将对应行的两个表格绘制在同一画布上,最后保存为单独PDF。

完整代码实现

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

# 替换为你的实际DataFrame
df_particip = pd.DataFrame({
    'country': ['CZ', 'CZ', 'CZ'],
    'number': [2, 4, 5],
    'Particip': [731658.0, 696739.0, 580834.0],
    'EvoParticip': [26.1, -13.2, -10.5]
})

df_trans = pd.DataFrame({
    'country': ['CZ', 'CZ', 'CZ'],
    'number': [2, 4, 5],
    'Trans': [1656171.0, 16265.0, 17302.0],
    'EvoTrans': [12.9, 26.0, 26.2]
})

# 按唯一标识符合并,确保行完全对应(数据已按匹配顺序排列可跳过)
merged = pd.merge(df_particip, df_trans, on=['country', 'number'])

# 循环每一行生成独立PDF
for idx, row in merged.iterrows():
    # 获取当前行的两个DataFrame记录
    particip_row = df_particip[(df_particip['country'] == row['country']) & (df_particip['number'] == row['number'])]
    trans_row = df_trans[(df_trans['country'] == row['country']) & (df_trans['number'] == row['number'])]
    
    # 创建独立画布,隐藏坐标轴
    fig, ax = plt.subplots(figsize=(8, 4))
    ax.axis('off')
    
    # 绘制第一个表格(参与数据)
    table1 = ax.table(
        cellText=particip_row.values,
        colLabels=particip_row.columns,
        loc='upper center',
        cellLoc='center'
    )
    table1.auto_set_font_size(False)
    table1.set_fontsize(10)
    
    # 绘制第二个表格(交易数据),避免重叠
    table2 = ax.table(
        cellText=trans_row.values,
        colLabels=trans_row.columns,
        loc='lower center',
        cellLoc='center'
    )
    table2.auto_set_font_size(False)
    table2.set_fontsize(10)
    
    # 调整布局防止内容截断
    plt.tight_layout()
    
    # 保存PDF,文件名用标识符区分
    pdf_filename = f"{row['country'].lower()}_{row['number']}.pdf"
    with PdfPages(pdf_filename) as pp:
        pp.savefig(fig, bbox_inches='tight')
    
    # 关闭画布释放内存
    plt.close(fig)

关键说明

  • 行匹配:用pd.merge通过country和number确保两行严格对应,避免顺序错乱;若数据已按匹配顺序排列,可直接按索引循环。
  • 画布设置:每个PDF对应独立画布,隐藏坐标轴让表格更整洁。
  • 表格布局:通过loc参数设置两个表格的上下位置,避免内容重叠。
  • 命名规则:用country_number作为PDF文件名,方便快速识别对应行。

内容的提问来源于stack exchange,提问作者refokaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:43:34