使用pd.concat合并多个小DataFrame为大表时最终为空的求助
问题解决方法
问题根因
- 你没有将每次清洗完成的子DataFrame更新到总表变量中,每次
concat都使用初始的空all_data和当前子表拼接,循环结束后初始的all_data始终为空。 - 合并逻辑和单表清洗逻辑顺序错误,应该先完成单个子表的全部清洗操作,再合并到总表,避免重复执行重命名、索引调整等操作。
修正后代码
import camelot import pandas as pd # 读取PDF得到表格 pdf_data = camelot.read_pdf('GMCC services 8517404.pdf', flavor='lattice', pages='1', encoding='utf-8' ) # 先建列表存储所有清洗好的子表,最后一次性合并性能更高 df_list = [] for info in pdf_data: # 读取当前子表 df = info.df # 重命名业务字段 df = df.rename({0:'product_no',1:'description', 2:'quantity', 3:'net_price', 4:'total'}, axis='columns') # 提取当前表格的站点编码 site = df.iloc[-1, 0] # 删除当前表格首行 df = df.drop(index=df.index[0]).reset_index(drop=True) # 新增站点列 df['site'] = site # 删除当前表格末行 df = df.drop(index=df.index[-1]).reset_index(drop=True) # 清洗完成的子表加入列表 df_list.append(df) # 所有子表处理完毕后一次性合并为总表,ignore_index自动重置行索引 all_data = pd.concat(df_list, ignore_index=True) # 打印合并后的完整大表 print(all_data)
补充说明
用列表先存储所有子表最后一次性concat的方式,比循环中每次拼接总表的性能高很多,在你有73个表格的场景下优化效果更明显。
内容的提问来源于stack exchange,提问作者victorR
相关产品推荐
相关产品推荐

