如何将含FactSet XML数据的XLSX文件转为Pandas DataFrame?
处理含FactSet XML数据的XLSX转Pandas DataFrame问题
问题分析
你遇到的空DataFrame报错,是因为目标工作表里只有FactSet的XML数据提示文本,没有实际结构化数据;即使重新保存,文件可能仍残留FactSet的元数据干扰读取。以下是几种可行的解决方法:
方法1:确认并读取实际数据工作表
FactSet生成的文件通常会把XML数据和实际数据放在不同工作表里,先排查所有工作表:
import pandas as pd # 列出文件中所有工作表名称 xls = pd.ExcelFile('Basecopy.xlsx') print(xls.sheet_names) # 选择输出结果中对应实际数据的工作表(比如名称为"Data"的表) df = pd.read_excel('Basecopy.xlsx', sheet_name="Data") print(df)
方法2:跳过提示行读取有效数据
如果实际数据和提示文本在同一个工作表,只是提示行在顶部,用skiprows跳过无关行:
import pandas as pd # 跳过第一行提示文本,从第二行开始读取 df = pd.read_excel('Basecopy.xlsx', sheet_name=0, skiprows=1) # 若提示占多行,可调整skiprows参数(比如skiprows=3跳过前3行) # 保存时去掉索引避免生成Unnamed列 df.to_excel('baseactivos2.xlsx', index=False) df2 = pd.read_excel('baseactivos2.xlsx') print(df2)
方法3:精准读取单元格范围
如果数据集中有大量空行或不规则格式,用openpyxl直接指定读取区域:
from openpyxl import load_workbook import pandas as pd wb = load_workbook('Basecopy.xlsx') ws = wb.active # 从第2行开始读取所有非空行(根据实际情况调整min_row) data_rows = [] for row in ws.iter_rows(min_row=2, values_only=True): # 跳过全空的行 if any(cell is not None and cell != '' for cell in row): data_rows.append(row) # 转为DataFrame,假设第1行(原A1)是列名 df = pd.DataFrame(data_rows[1:], columns=data_rows[0]) print(df)
方法4:手动导出为CSV再读取
如果代码方法仍有问题,手动处理更直接:
- 打开原XLSX文件,选中包含实际数据的单元格区域
- 复制到新的空白工作表,删除所有提示文本和空行
- 将新工作表另存为CSV格式
- 用Pandas读取CSV:
df = pd.read_csv('cleaned_data.csv') print(df)
内容的提问来源于stack exchange,提问作者SaiVermilion
相关产品推荐
相关产品推荐

