【问题标题】:Iteratively read excel sheet names, split and save them as new columns for each sheet in Python迭代读取 Excel 工作表名称,将它们拆分并保存为 Python 中每个工作表的新列
【发布时间】:2021-08-22 09:23:41
【问题描述】:

假设我们有许多带有多个工作表的excel文件,如下文件data1.xlsx

表 1:2021_q1_bj

   a  b   c  d
0  1  2  23  2
1  2  3  45  5

表 2:2021_q2_bj

   a  b   c  d
0  1  2  23  6
1  2  3  45  7

表 3:2019_q1_sh

   a  b   c
0  1  2  23
1  2  3  45

表 4:2019_q2_sh

   a  b   c
0  1  2  23
1  2  3  40

我需要获取每张工作表的工作表名称,然后将它们拆分为_,将第一部分存储为year,将第二部分存储为quarter,最后一部分存储为city

最后,我会将它们保存回带有多张工作表的 excel 文件。

即,对于第一张纸:

   a  b   c  d  year quarter city
0  1  2  23  2  2021      q1   bj
1  2  3  45  5  2021      q1   bj
2  1  2  23  6  2021      q1   bj
3  2  3  45  7  2021      q1   bj

如何在 Python 中实现这一点?谢谢。

循环所有的excel文件:

base_dir = './'
file_list = os.listdir(base_dir)

for file in file_list:
    if '.xlsx' in file:
        file_path = os.path.join(file_path, )
        dfs = pd.read_excel()

【问题讨论】:

  • with sheet_name=None, pandas.read_excel 将文件中的所有工作表读取到数据帧的字典中,其中工作表名称是字典键。鉴于此,循环遍历所有文件并在循环中执行此操作应该很容易。

标签: python-3.x pandas dataframe


【解决方案1】:

您可以使用 f = pd.ExcelFile('data1.xlsx') 将 excel 文件作为对象读取,然后通过迭代 f.sheet_names 来循环工作表名称列表,将每个工作表名称(例如“2019_q1_sh”字符串)拆分为适当的 @ 987654324@ 并将这些设置为您正在从每张表中读取的 DataFrame 中的新列的值。

然后创建一个字典,以工作表名称为键,对应的修改后的 DataFrame 为值。您可以创建一个自定义的save_xls 函数,该函数接收此类字典并将其保存,如this helpful answer 中所述。

更新:由于您想遍历当前目录中的所有 excel 文件,您可以使用 glob 库来获取所有扩展名为 .xlsx 的文件并遍历每个文件,将它们读入,并在文件名前使用字符串new_ 保存一个新文件

import pandas as pd
from pandas import ExcelWriter
import glob

"""
Save a dictionary of dataframes to an excel file, with each dataframe as a separate page

Reference: https://stackoverflow.com/questions/14225676/save-list-of-dataframes-to-multisheet-excel-spreadsheet
"""
def save_xls(dict_df, path):
    writer = ExcelWriter(path)
    for key in dict_df:
        dict_df[key].to_excel(writer, key)
    writer.save()

## loop through all excel files
for filename in glob.glob("*.xlsx"):
    f = pd.ExcelFile(filename)
    dict_dfs = {}
    for sheet_name in f.sheet_names:
        df_new = f.parse(sheet_name = sheet_name)

        ## get the year and quarter from the sheet name 
        year, quarter, city = sheet_name.split("_")
        df_new["year"] = year
        df_new["quarter"] = quarter
        df_new["city"] = city

        ## populate dictionary 
        dict_dfs[sheet_name] = df_new 

    save_xls(dict_df = dict_dfs, path = "new_" + filename)

【讨论】:

  • 谢谢,如果我想循环所有的 excel 文件并应用上面的方法,就像你发布到每个文件一样?
  • 是的,您可以这样做 - 在定义 pd.ExcelFile 对象 f 之前创建一个外部循环,并在运行 save_xls 之后结束循环。您还需要确保不会像我那样对文件名进行硬编码
  • @ahbon 确定你可以使用像glob 这样的包来读取所有扩展名为.xlsx 的文件
  • 非常感谢您的帮助,我会用我的真实数据进行测试,祝您有美好的一天。
  • 没问题!很高兴我的回答很有帮助
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多