将不同文件中的多个excel表导入python并将它们连接到一个数据框中

Posted

技术标签:

【中文标题】将不同文件中的多个excel表导入python并将它们连接到一个数据框中【英文标题】:Import multiple excel sheets from different files into python and concatenate them into one dataframe 【发布时间】:2020-04-22 08:57:02 【问题描述】:

我正在尝试将来自不同 Excel 文件的多张工作表合并到一个数据框中。所有文件都有多个工作表,其中一张工作表在所有文件中具有相同的名称 - 这是我有兴趣组合成一个数据框的工作表。所有文件都在同一个目录中。

import pandas as pd
import os, glob
os.chdir(r'c:\Users\Documents\Files')

def files():                                 #to select the files that have RMP and WE on their name
    list_files= pd.Series()
    for file in glob.glob('RMP*WE*'):
        data= pd.Series(file)
        list_files= list_files.append(data, ignore_index=True)
    return list_files
a= files()
print("This is the variable a\n", a)

def extract_tab():                       #to concatenate the sheet called Metrics that all files have
    frame_files= pd.DataFrame()
    try:
        for file in a:
            data= pd.read_excel(file,sheet_name='Metrics')
            frame_files= frame_files.append(data, ignore_index=True)
    except:
        pass
    return  frame_files

b= extract_tab()

print("This is b\n",b)

变量 a(files 函数)的结果是符合命名标准的文件列表。但是变量 b (extract_tab 函数)的结果是一个空数据框。我做错了什么?

我查看了这个帖子Import multiple excel files into python pandas and concatenate them into one dataframe,但它不起作用......虽然我确实从中获得了一些想法。

【问题讨论】:

Datanovice 的回答很棒。但我认为您的实现的真正问题是您将文件路径转换为 ​​pd.series @theletz 你有什么建议来解决我选择文件的方式? 【参考方案1】:

IIUC,你可以对你的目录做一个列表比较。

如果使用 Python 3.4 +

from Pathlib import Path
path_ = 'c:\Users\Documents\Files'

dfs = [pd.read_excel(f,sheet_name='metrics') for f in Path(path_).glob('RMP*WE*')]

df = pd.concat(dfs)

或者如果你只能使用os 模块:

os.chdir('c:\Users\Documents\Files')
files = glob.glob('RMP*WE*')
dfs = [pd.read_excel(f,sheet_name='metrics') for f in files]
df = pd.concat(dfs)

更新。

如果您需要处理丢失的工作表,这将是一个不错的方法。

def exlude_sheet(excel_list, sheet):
    """
    takes two arguments:
    1. A list of excel documents
    2. The name of your sheet.
    3. Returns a single data frame after 
    working through your list of excel objects. 
    """
    from xlrd import XLRDError
    df_lists = []
    for file in excel_list:
        try:
            file_df = pd.read_excel(file, sheet_name=sheet)
            df_lists.append(file_df)
        except (XLRDError) as e:
            print(f"e skipping")
            continue
    try:
        return pd.concat(df_lists)
    except ValueError as err:
        print("No Objects Matched")

测试。

xlsx = [f for f in Path(path_).glob('RMP*WE*')]
df = exlude_sheet(xlsx,sheet='Metrics')
out:
No sheet named <'Metrics'> for doc_1 skipping
No sheet named <'Metrics'> for doc_final skipping
print(df)
      Column_A  data
0           0     0
1           1     1
2           2     2
3           3     3
4           4     4

测试 2

在没有找到匹配的工作表时进行测试:

exlude_sheet(xlsx,'foobar')
No sheet named <'foobar'> skipping
No sheet named <'foobar'> skipping
No sheet named <'foobar'> skipping
No Objects Matched

【讨论】:

如果不是所有文件都有“指标”选项卡,您将如何修改此代码? 95% 的文件有它,但其余的没有,它会引发错误。 我尝试了以下方法来处理并非所有文件实际上都有名为“metrics:import pandas as pd import glob, os from glob import glob os.chdir('c:\Users\Documents\Files') def noncom(): for i in glob('RMP*WE*'): try: df= pd.concat(pd.read_excel(i, sheet_name='Metrics')) except: pass return df a = noncom() print(a)”的工作表但我收到以下错误:UnboundLocalError: local variable 'df' referenced before assignment I '我会发布我的答案 感谢更新代码。它似乎缺少 df_lists 的定义,所以我添加了它。但后来它告诉我'xlrd.biffh.XLRDError: No sheet named ' 然后'AttributeError: 'str' object has no attribute 'stem' 我正在使用pathlib... 我定义了 df_lists = pd.DataFrame() @Leo 那是你的问题,df_list 需要是一个列表而不是单个DataFrame,不要定义和使用上面的函数,它会在函数内部创建列表并返回单个数据框架。【参考方案2】:

试试

import pandas as pd
from glob import glob

os.chdir('c:\Users\Documents\Files')
df = pd.concat([pd.read_excel(i, sheet_name='Metrics') for i in glob('RMP*WE*')])

【讨论】:

以上是关于将不同文件中的多个excel表导入python并将它们连接到一个数据框中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 导入 - 将多个 excel 文件导入数据框

使用 SSIS 将多个 Excel 文件导入表中

将多个 csv 文件中的数据导入一个 Excel 工作表并计算平均值

python将多个excel中的所有工作表附加到pandas数据框中的有效方法

自动将不同的 Excel 文件导入 MS Access 2010 表

如何用VBA将EXCEL中的若干的数据导入不同的word文档