将不同文件中的多个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 文件导入数据框
将多个 csv 文件中的数据导入一个 Excel 工作表并计算平均值
python将多个excel中的所有工作表附加到pandas数据框中的有效方法