- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个 Excel 文件,我想从中生成单独的数据框,这些数据框将是每个文件中工作表的任意子集的串联。
重要的是我能够对工作表进行子集化(在这里我通过索引到 sheet_names
列表来做到这一点),并且还以某种方式跟踪出处(就像我在这里使用 assign
方法)。
此代码目前有效,但我担心我缺少一些使其更高效的基本方法(当我最终得到一个包含 20 张纸的文件时)。
我已经回顾了其他几个与连接多个 CSV 或 Excel 文件有关的问题1,但是很难将这些问题归纳为一个<中的解析工作表的问题/em> 文件,关于效率。
这个问题的部分原因是我之前使用生成器连接 Excel 文件,但我很难将这些情况推广到这个情况。
import pandas as pd
import xlrd
import xlwt
def file_parser(file):
df_list = []
for x in file.sheet_names[1::]:
df = file.parse(x).assign(Source=x)
df_list.append(df)
return df_list
1 How to parse dataframes from an excel sheet with many tables (using Python, possibly Pandas)
Import multiple csv files into pandas and concatenate into one DataFrame
Pands ExcelFile.parse() reading file in as dict instead of dataframe
最佳答案
“高效”可以有不同的解释。根据您的描述(尤其是提到生成器),我猜您的意思是内存和计算效率(使用尽可能少的内存并避免对相同数据重复循环)。有了这个想法,就开始吧:
def df_gen(filename, sheet_names):
with xlrd.open_workbook(filename, on_demand=True) as xl_file:
for sheet in sheet_names:
yield pd.read_excel(
xl_file, sheetname=sheet, engine='xlrd').assign(source=sheet)
# tell xlrd to let the sheet leave memory
xl_file.unload_sheet(sheet)
这利用了 xlrd 的 "worksheets on demand"功能以避免将整个 Excel 文档加载到内存中。在构造 DataFrame 后,工作表会从内存中显式卸载。因为它使用 yield
它是一个生成器,同时创建多少数据帧取决于您的使用情况。下面是将此生成器传递给 pandas.concat
的示例用法:
df = pd.concat(df_gen('file_name.xlsx', ['sheet1', 'sheet2']), ignore_index=True)
不过请注意,concat
materializes在进行串联之前生成器中的所有内容,所以这并不一定比你建立列表的例子更有效,除了我的函数有意管理 xlrd 工作簿的资源使用。在这种情况下,我认为您最终会在内存中一次获得 1 或 2 个数据副本,具体取决于 concat
的内部结构。
如果您真的担心内存问题,您可以使用生成器一次一张地迭代构建数据框:
# create a generator
gen = df_gen(str(filename), sheet_names)
# get starting point
df = next(gen)
# iterate over the rest of the generator
for next_df in gen:
df = df.append(next_df, ignore_index=True)
我预计这在计算效率上会低于同时调用整个所需数据帧集的 concat
,但我还没有研究这是否真的如此。在这种情况下,我认为您最终一次只会得到内存中所有数据的 1 个副本,再加上生成器每次循环的工作表数据的一个额外副本。
您最了解自己的情况,但除非这些是一些真正令人印象深刻的 Excel 文件,否则我不会投入大量精力来优化内存和计算,而不仅仅是看似明显的胜利。考虑到这一点,这里有一个利用 pandas.read_excel
能力的简短函数。一次阅读多张纸:
def sheets_to_df(filename, sheet_names):
df_dict = pd.read_excel(filename, sheetname=sheet_names)
return pd.concat(
(df.assign(source=sheet) for sheet, df in dfs.items()), ignore_index=True)
需要注意的一点是,当传入文件名 read_excel
时,将 load the entire Excel document (例如,不使用 xlrd 的“按需”功能)。因此,虽然这在代码行方面是高效的,但在内存方面绝对不是高效的。我认为这会短暂地以内存中的所有数据结束 2-3 次:一次在 df_dict
中,一次在最终连接的数据帧中(可能再次取决于 concat
的内部结构) >).但是一旦这个函数返回,你在最终数据框中只剩下一个副本。如果您无论如何都打算阅读大部分工作表,这不会是一个巨大的浪费(假设它们都至少两次适合内存),但如果您打算只阅读工作表的一小部分,这可能有点浪费浪费。
希望对您有所帮助!您可以在此处将其作为 Jupyter 笔记本获取:https://gist.github.com/jiffyclub/9ab668f63c3d0f9adf3e730dc37cd419
关于python - 如何使此功能更有效地连接来自单个文件的 Excel 工作表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45113070/
我最近一直在学习 Clojure。 Clojure 世界中是否有类似 Scala 的工作表这样的东西,我可以在其中放入任何代码并在保存后立即对其进行评估?或者也许 Clojure 有类似的解决方案?
有人可以帮我吗?我想知道如何过滤工作表中的多个选项卡(C1-C19)。这是我所做的: 我创建了一张表格,将所有回复存储在我的谷歌表单(事件注册表单)中。每个参与者将收到一个坦克编号,每个坦克编号根据其
这就是我将打开的面板显示为 float 窗口的方式。 有人可以帮我将面板作为工作表运行吗?窗口对象是mWindow。我使用的许多标准代码都已被折旧。 NSOpenPanel *openPanel =
当您仅键入 worksheets() 时,默认范围 ActiveWorkbook 或 ThisWorkbook 是什么?对于那些不了解这些区别的人来说,它们非常重要,尤其是在 Excel 2013 中
我有一个带有一些图表的 HTML 页面。我想要做的是编写一个加载 javascript 函数,它将从 excel 表中读取值,将它们存储在变量中并在 html 页面上使用它们。我的问题是是否有任何 j
我需要将参数 callFrom 传递给 SwiftUI 中的工作表。 奇怪的是,该参数在第一次调用时没有使用,但对以下调用有效。 import SwiftUI struct ContentView:
我试着 var tempSheet = wrksheets[sheetName] as Worksheet; 在哪里 wrksheets是类型表 sheetName 是“带空格的工作表名称” 如果
该函数用作“ Assets 类别分配”引擎(在参数范围内具有约束)并在数组的每一行上模拟投资组合模型。我尝试使用四种方法将数组发布到工作表上,但每种方法都失败了。 对于 Assets A、B、C、D
目前,我的 excel 文件有两张表,一张名为“English”,一张名为“French”。 我以编程方式打开我的工作簿并编辑我的英文表,没有任何问题。当我打开第二张工作表时,出现以下错误: The
我添加了一个 VBA 表单 userform和一个模块 Module1在 Excel 中打开 Microsoft VBA 编辑器 (Alt+F11)。 现在,每当我打开任何其他 Excel 时,按 A
在单个 Excel 工作簿中,我想选择各种工作表来运行 VBA 子例程。我找到了显示如何遍历选定工作表的代码,它使用“MsgBox sh.Name”;但是,当我将代码放入其中时,它只会影响选择的最后一
我想知道是否有一个函数可以在 Excel 中加载特定于 Python 的工作表,例如,如果我有 34 张工作表只加载前 25 张工作表。通过以下行,我加载了所有工作表。 xlsx=pd.ExcelFi
我有一个名为“A”、“B”、“C”等的工作表的 xlsx。我需要形成一个名称为“A”、“B”、“C”的表作为第一列,以及来自的一些数据每个工作表中与第二列相同的单元格。例如,这可能看起来像: S
我有一张用密码保护的工作表。当我使用 VBA 更改该表上的任何内容时,我会像这样取消保护: Private Sub Worksheet_Change(ByVal target As Range)
我想将 Excel 文档插入 Excel 工作表。我可以通过以下步骤手动执行此操作; 插入/文本/对象/从文件创建(勾选显示为图标)/浏览。 然后我选择文件并插入文档。 我想通过宏来做到这一点。 (录
是否可以创建 批处理文件那将执行以下操作? 重命名 Excel 文件中的单个工作表(不是 Excel 工作簿/文件本身) 将简单格式应用于 Excel 文件 - 例如,将字体和字体大小应用于整个工作簿
Private Sub CommandButton1_Click() Dim ws As Worksheet With Application.FileDialog(msoFileDialog
我想知道是否可以在不复制该工作表的情况下引用另一本工作簿中的 Excel 工作表? 情况:我有一些非常大的工作表,其中充满了各种数据,但我不想在我的工作簿中保留它们的副本,因为虽然每个工作簿都使用相同
我有这个 Python 字典,我想将这个数据写入 Excel 文件。 注意:有很多类别,每个类别有很多汽车(为简单起见,我使用了 2 个类别) data = {"Category": {"Diesel
我有一个 excel 工作簿,在工作簿中我有 2 张名为 Front Page 和 Drafting 的工作表。起草工作表引用了首页工作表中的一些值。这只是一个基本的引用 我有像这样的公式:='Fro
我是一名优秀的程序员,十分优秀!