Python函数无法返回预期DataFrame输出问题求助
问题分析与修复方案
核心问题点
- 循环提前终止:你把
return DFTrust_Text1写在了for循环的第一次迭代里,导致函数只处理2021年的数据就直接返回,2022年的逻辑完全没执行,后面的year=year+1也是无效代码。 - 未接收函数返回值:调用
Accessingtxt_func(Trustcode)时,没有把函数返回的DataFrame赋值给外部变量,外部的DFTrust_Text1始终是初始空表。 - Year字段类型错误:
'Year': {year}会把年份存成集合(比如{2021}),应该直接用year变量。 - 低效的append用法:pandas的
append方法已被弃用,多次调用会影响性能,推荐用列表收集数据后一次性转DataFrame。
修复后的函数代码
import pandas as pd import os from pdfminer.high_level import extract_text # 假设你用的是pdfminer提取文本 def Accessingtxt_func(Trustcode): data_list = [] # 用列表暂存所有数据,避免多次append for year in range(2021, 2023): # 先提取PDF文本 txt_content = extract_text(f'Trust{Trustcode}-{year}a.pdf') # 写入文本文件 with open(os.path.join(mypath, f'{ts}Trust{Trustcode}-{year}a.txt'), 'w', encoding='utf-8') as fw: fw.write(txt_content) # 分割文本并添加到数据列表 txt_split = txt_content.split('\n\n') data_list.append({ 'Text': txt_split, 'Year': year, # 直接用年份数值,不要集合 'Month': 9, 'Type': 1, 'Trustcode': Trustcode }) # 一次性生成DataFrame return pd.DataFrame(data_list, columns=['Text','Month','Year','Type', 'Trustcode'])
修复后的调用代码
# 初始化总DataFrame DFTrust_Text1 = pd.DataFrame(columns=['Text','Month','Year','Type', 'Trustcode']) for Trustcode in range(12,14): print(Trustcode) # 接收函数返回的结果,并合并到总表 temp_df = Accessingtxt_func(Trustcode) DFTrust_Text1 = pd.concat([DFTrust_Text1, temp_df], ignore_index=True) # 查看结果 print(DFTrust_Text1.head())
额外说明
- 把文件写入操作移到文本提取之后,逻辑更清晰,减少嵌套层级;
- 列表收集数据再转DataFrame的方式,比多次调用
append效率更高,也符合pandas官方推荐的写法; - 调用时必须接收函数返回值,否则函数处理的结果无法传递到外部变量。
内容的提问来源于stack exchange,提问作者Valdan
相关产品推荐
相关产品推荐

