Python:循环遍历 Excel 工作表,将标题信息分配给每个工作表上的列,然后合并到一个文件

Posted

技术标签:

【中文标题】Python:循环遍历 Excel 工作表,将标题信息分配给每个工作表上的列,然后合并到一个文件【英文标题】:Python: Loop through Excel sheets, assign header info to columns on each sheet, then merge to one file 【发布时间】:2020-02-06 05:54:04 【问题描述】:

我是 Python 新手,正在尝试自动化一些任务。我有一个包含 8 张工作表的 Excel 文件,其中每张工作表的顶部都有一些标识符,下面是带有标题的表格数据。每个工作表都有感兴趣的标识符和相同位置的表。 我想要做的是从每张纸的顶部提取一些数据并将它们作为列插入,删除不需要的行(在我将其中一些分配给列之后)和列,然后合并到一个 CSV 文件中作为输出。

我编写的代码完成了这项工作。我的代码读取每张工作表,在工作表上执行操作,然后在使用 .concat 合并它们之前为下一张工作表启动相同的过程(8 次)。

import pandas as pd
import numpy as np
inputfile = "input.xlsx" 
outputfile = "merged.csv"

##LN X: READ FIRST SHEET AND ASSIGN HEADER INFORMATION TO COLUMNS

df1 = pd.read_excel(inputfile, sheet_name=0, usecols="A:N", index=0)

#Define cell locations of fields in the header area to be assigned to 
columns
#THIS CELL LOCATIONS ARE SAME ON ALL SHEETS
A = df1.iloc[3,4]
B = df1.iloc[2,9]
C = df1.iloc[3,9]
D = df1.iloc[5,9]
E = df1.iloc[4,9]

#Insert well header info as columns in data for worksheet1
df1.insert(0,"column_name", A)

df1.insert(1,"column_name", B)

df1.insert(4,"column_name", E)

# Rename the columns in `enter code here`worksheet1 DataFrame to reflect 
actual column headers
df1.rename(columns='Unnamed: 0': 'Header1', 
               'Unnamed: 1': 'Header2', , inplace=True)         

df_merged = pd.concat([df1, df2, df3, df4, df5, df6, df7, 
  df8],ignore_index=True, sort=False)

#LN Y: Remove non-numerical entries

df_merged = df_merged.replace(np.nan, 0)

##Write results to CSV file

df_merged.to_csv(outputfile, index=False)

由于此代码将用于具有不同数量工作表的其他 Excel 文件,因此我正在寻找有关如何将重复操作包含在循环中的每个工作表中的任何指针。基本上为每张纸重复 LN X 到 LN Y 之间的步骤(8 次!!)。我正在为如何使用循环功能而苦苦挣扎。在此先感谢您的帮助。

【问题讨论】:

嗨,到目前为止做得很好!我将从这篇 SO 帖子中的答案开始:***.com/questions/17977540/… 以获取字典中的表格,然后遍历字典以处理每张表格。有意义吗? @mgrollins 感谢您的评论。我在发布之前阅读了该帖子。我知道如何使用 ExcelFile 或 read-excel(单张,一次全部)读取表格。我面临的挑战是如何在循环中运行每个工作表的操作,即编写一次函数并将其应用于每个工作表,因为它们被读入 pandas。 【参考方案1】:
df1 = pd.read_excel(inputfile, sheet_name=0, usecols="A:N", index=0)

您应该将参数 sheet_name 更改为

sheet_name=None

那么 df1 将是一个 DataFrames 的字典。然后你可以使用

遍历 df1
for df in df1:

  df1[df].insert(0,"column_name", A)
....

现在执行您的操作并合并 dfs。您可以再次循环它们并将它们连接到一个最终的df。

【讨论】:

感谢您的回答。我试过了,得到了 AttributeError:'collections.OrderedDict' 对象没有属性 'iloc'。这是我将新列的内容映射到单元格地址的部分。例如井 = df1[3.4] 谢谢。这很有效,使我的代码更短。最好的部分是它现在可以用于具有任意数量工作表的类似文件!

以上是关于Python:循环遍历 Excel 工作表,将标题信息分配给每个工作表上的列,然后合并到一个文件的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 Excel 工作表并使用 C# 将文本保存到 TXT 文件中

循环遍历动态表 - python

在python中添加带有for循环的新excel表

循环浏览文件夹以将多个 Excel 工作表合并为一列

Excel VBA - 循环遍历多个文件夹中的文件,复制范围,粘贴到此工作簿中

使用 Perl Excel 循环遍历单列而不是每一列