我有excel电子表格我想连接成一个pandas数据帧,但输入电子表格的表格范围是不规则的。输入的数据可能从每个电子表格中的例如C5,D8,G4等开始。以下示例显示它从B5开始。
我不知道每个电子表格中表格的起始位置,或者指定每个工作簿中的哪个工作表,因为有几百个。我打算将所有工作表编译成数据帧,然后提取我需要的数据行。数据大多采用相同的格式,但我还需要记住电子表格中的任何注释。
如果每个电子表格中的数据对齐在一起会更简单,那么我可以使用索引标签提取我需要的行。有没有办法将每个电子表格中的所有数据对齐,从每个电子表格的第一列开始?
这是我到目前为止所做的:
import os
import pandas as pd
import glob
import numpy as np
path =r'dir'
allFiles = glob.glob(path + "/*.xlsx")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_excel(file_,index_col=None, header=0)
list_.append(df)
frame = pd.concat(list_)
print(list_)
答案 0 :(得分:2)
这是openpyxl
的解决方案无需保存新文件或将数据预加载到内存中
import itertools
from openpyxl import load_workbook
from pandas import DataFrame
def get_data(ws):
for row in ws.values:
row_it = iter(row)
for cell in row_it:
if cell is not None:
yield itertools.chain((cell,), row_it)
break
def read_workbook(filename):
wb = load_workbook(filename)
ws = wb.active
return DataFrame(get_data(ws))
您可以轻松修改代码,以限制在考虑空行
之前所采取的最大步骤数答案 1 :(得分:0)
您可以尝试将表格转换为csv并删除前导逗号。
with open("your_file_as_csv", 'r') as file_in, open("output_as_csv", 'w') as file_out:
for line in file_in:
file_out.write(line.strip(','))
这至少会删除空白行并将所有内容与第一行和第一列对齐。
但请注意,在您的示例中,您将遇到包含“摘要2017”的第2行的麻烦。
您确定所有表格的格式相同(列标签,订单,编号吗?)
答案 2 :(得分:0)
您可以使用此功能:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
df = df.dropna(axis=0, how='all')
df = df.dropna(axis=1, how='all')
writer = pd.ExcelWriter('out.xlsx')
df.to_excel(writer, 'out')
writer.save()
在:
后: