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

Python循环内读取文件后追加DataFrame未获完整数据集的问题

解决循环读取HTML文件后无法生成完整DataFrame的问题

我看了你的代码,发现几个关键问题导致你拿不到完整数据集,咱们一步步来修正:

问题分析

  1. 列名初始化逻辑漏洞:你在循环外写了columns = list(df),但这里的df在循环启动前并没有定义(除非你提前手动赋值过,但逻辑上应该从读取的表格里动态获取列名,或者确保所有表格的列结构一致)。
  2. 字典转换逻辑错误:zip(columns, df.values)会把列名和整个表格的二维数组做配对,生成的字典是列名对应整行数据数组,而不是每一行对应一个键值对的字典,这完全偏离了你想要的每行数据结构。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:47:34