如何将共享标识符的两个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
相关产品推荐
相关产品推荐

