2017-08-16 54 views
0

我有Excel电子表格,我想连接成熊猫数据框,但输入到电子表格中的表格范围是不规则的。输入的数据可能开始于每个电子表格中的C5,D8,G4等。下面的例子显示它从B5开始。在python中对齐数据

我不知道表格在每个电子表格中的开始位置,或者指定每个工作簿中的哪个表格,因为有几百个表格。我打算将所有表单编译成一个数据框,然后提取我需要的数据行。数据大部分采用相同的格式,但我也需要记住电子表格中的任何注释。

如果每个电子表格中的数据对齐在一起,那么会更简单,然后我可以提取索引标签所需的行。是否有办法将每个电子表格中的所有数据对齐,以便在每个电子表格的第一列中开始?

这是我到目前为止有:

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_) 

回答

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)) 

您可以轻松地修改代码以限制的最大数量在考虑排空之前你需要采取的步骤

+0

这样做的窍门,谢谢。 – Iwan

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(',')) 

这将至少删除空白行并将所有内容与第一行和第一列对齐。

但请注意,在您的示例中,您将遇到包含“summary,2017”的第2行的麻烦。

你确定所有的表具有相同的格式(列的标签,顺序号?)