在python

时间:2017-08-16 20:17:53

标签: python excel pandas

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

3 个答案:

答案 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()

在:

enter image description here

后:

enter image description here