Python循环内读取文件后追加DataFrame未获完整数据集的问题
解决循环读取HTML文件后无法生成完整DataFrame的问题
我看了你的代码,发现几个关键问题导致你拿不到完整数据集,咱们一步步来修正:
问题分析
- 列名初始化逻辑漏洞:你在循环外写了
columns = list(df),但这里的df在循环启动前并没有定义(除非你提前手动赋值过,但逻辑上应该从读取的表格里动态获取列名,或者确保所有表格的列结构一致)。 - 字典转换逻辑错误:
zip(columns, df.values)会把列名和整个表格的二维数组做配对,生成的字典是列名对应整行数据数组,而不是每一行对应一个键值对的字典,这完全偏离了你想要的每行数据结构。 - DataFrame追加方式错误:
full_df.append(data, False)的用法有问题——首先full_df如果没有提前初始化会直接报错;其次append接收的是DataFrame/Series对象,而非字典列表;最后False作为ignore_index参数在这里也起不到正确的索引重置作用。
修正后的代码方案
推荐两种更可靠的写法,按需选择:
方案一:直接收集DataFrame后合并(高效首选)
这种方法跳过手动处理字典的步骤,简洁且效率更高,适合文件数量较多的场景:
import pandas as pd import glob # 初始化空列表存储每个文件的DataFrame dfs_collection = [] for file in glob.glob("*.html"): # 读取每个HTML文件的第3个表格(索引为2) single_df = pd.read_html(file)[2] # 若所有表格列结构一致,直接添加;若不一致,可在此处做列名对齐处理 dfs_collection.append(single_df) # 合并所有DataFrame,ignore_index=True重置全局索引 full_df = pd.concat(dfs_collection, ignore_index=True)
方案二:修正字典转换逻辑后追加
如果你坚持用字典列表的方式,需要调整每行数据的转换逻辑:
import pandas as pd import glob # 初始化空DataFrame full_df = pd.DataFrame() # 先从第一个文件获取列名(假设所有表格列结构一致) first_file = glob.glob("*.html")[0] columns = list(pd.read_html(first_file)[2]) for file in glob.glob("*.html"): df = pd.read_html(file)[2] # 遍历表格每一行,将列名与行值配对成字典 for row in df.values: row_dict = dict(zip(columns, row)) # 将单个字典转为DataFrame后追加,ignore_index=True避免索引冲突 full_df = full_df.append(pd.DataFrame([row_dict]), ignore_index=True)
关键注意事项
- 务必确保所有HTML文件中的第3个表格(
[2]索引)列名、列数完全一致,否则合并时会出现列缺失或数据错位的问题。 - 当处理大量文件时,
pd.concat比多次调用append效率高很多,优先选择方案一。
内容的提问来源于stack exchange,提问作者Mohmad_Foad
相关产品推荐
相关产品推荐

