如何使用 Pandas 在现有 Excel 文件中保存新工作表?

2025-01-07 08:44:00
admin
原创
145
摘要:问题描述:我想使用 excel 文件来存储用 python 编写的数据。我的问题是我无法将工作表添加到现有的 excel 文件中。在这里我建议使用一个示例代码来解决此问题import pandas as pd import numpy as np path = r"C:Users edelDesk...

问题描述:

我想使用 excel 文件来存储用 python 编写的数据。我的问题是我无法将工作表添加到现有的 excel 文件中。在这里我建议使用一个示例代码来解决此问题

import pandas as pd
import numpy as np

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

此代码将两个 DataFrame 保存到两个工作表中,分别名为“x1”和“x2”。如果我创建两个新的 DataFrame 并尝试使用相同的代码添加两个新的工作表“x3”和“x4”,则原始数据将丢失。

import pandas as pd
import numpy as np

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

我想要一个包含四张表的 excel 文件:'x1'、'x2'、'x3'、'x4'。我知道 'xlsxwriter' 不是唯一的“引擎”,还有 'openpyxl'。我还看到已经有其他人写过关于这个问题的文章,但我仍然不明白该怎么做。

这是从此链接获取的代码

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

他们说它有效,但很难弄清楚如何。我不明白“ws.title”、“ws”和“dict”在此上下文中是什么意思。

哪种方法是保存“x1”和“x2”,然后关闭文件,再次打开并添加“x3”和“x4”的最佳方法?


解决方案 1:

谢谢。我相信,完整的示例对遇到同样问题的其他任何人都有帮助:

import pandas as pd
import numpy as np

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.close()

在这里我生成一个 excel 文件,据我所知,它是通过“xslxwriter”还是“openpyxl”引擎生成的并不重要。

当我想在不丢失原始数据的情况下写入时

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.close()

此代码可以完成这项工作!

解决方案 2:

用于创建新文件

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

要附加到文件,请使用mode='a'中的参数pd.ExcelWriter

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

默认为mode ='w'。请参阅文档。

解决方案 3:

在您分享的示例中,您正在将现有文件加载到book并将writer.book值设置为book。在行中,writer.sheets = dict((ws.title, ws) for ws in book.worksheets)您将以 的身份访问工作簿中的每个工作表ws。工作表标题是,ws因此您正在创建一个{sheet_titles: sheet}键值对的字典。然后将此字典设置为 writer.sheets。本质上,这些步骤只是从中加载现有数据'Masterfile.xlsx'并用它们填充您的编写器。

现在假设您已经有一个包含x1x2作为工作表的文件。您可以使用示例代码加载该文件,然后可以执行类似以下操作来添加x3x4

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

这应该可以实现您想要的功能。

解决方案 4:

这是一个一次性将多个数据写入 Excel 的简单示例。此外,当您想将数据附加到已写入的 Excel 文件(已关闭的 Excel 文件)上的某个工作表时也是如此。

首次写入 Excel 时。(将“df1”和“df2”写入“1st_sheet”和“2nd_sheet”)

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

关闭 Excel 后,如果您希望在同一个 Excel 文件但另一张工作表中“附加”数据,假设将“df3”附加到工作表名称“3rd_sheet”。

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

注意excel格式不能是xls,可以使用xlsx格式。

解决方案 5:

每次你想要将 Pandas DataFrame 保存到 Excel 时,你都可以调用此函数:

import os

def save_excel_sheet(df, filepath, sheetname, index=False):
    # Create file if it does not exist
    if not os.path.exists(filepath):
        df.to_excel(filepath, sheet_name=sheetname, index=index)

    # Otherwise, add a sheet. Overwrite if there exists one with the same name.
    else:
        with pd.ExcelWriter(filepath, engine='openpyxl', if_sheet_exists='replace', mode='a') as writer:
            df.to_excel(writer, sheet_name=sheetname, index=index)

解决方案 6:

我强烈建议您直接使用openpyxl,因为它现在支持 Pandas DataFrames。

这使您可以专注于相关的 Excel 和 Pandas 代码。

解决方案 7:

无需使用 ExcelWriter,使用 openpyxl 中的工具即可完成此操作,这样可以更轻松地使用以下方法将字体添加到新工作表中openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:workspacedata.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:workspacedataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)

解决方案 8:

您可以将您感兴趣的现有工作表(例如“x1”、“x2”)读入内存,然后在添加更多新工作表之前将它们“写回”(请记住,文件中的工作表和内存中的工作表是两个不同的东西,如果您不读取它们,它们将会丢失)。此方法仅使用“xlsxwriter”,不涉及 openpyxl。

import pandas as pd
import numpy as np

path = r"C:UsersedelDesktopexcelDataPhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_excel(writer, sheet_name='x1')
df2.to_excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name='x3')
df4.to_excel(writer, sheet_name='x4')
writer.save()
writer.close()

如果要保留所有现有工作表,则可以将上面的 begin 和 end 之间的代码替换为:

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_excel(writer, sheet_name=sheet)

解决方案 9:

另一个相当简单的方法是创建如下方法:

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_excel(writer, sheet_name, index=False)

这里的想法是,如果存在,则在path_to_file处加载工作簿,然后将data_frame作为具有sheet_name的新工作表附加。 如果工作簿不存在,则创建它。 似乎openpyxlxlsxwriter都不会附加,因此如上面 @Stefano 的示例所示,您确实必须加载然后重写以附加。

解决方案 10:

#This program is to read from excel workbook to fetch only the URL domain names and write to the existing excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:UsersxyzDesktopPython\n
l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_excel(r"C:UsersxyzDesktopPython/urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

解决方案 11:

如果你想添加空白表

xw = pd.ExcelWriter(file_path, engine='xlsxwriter')    
pd.DataFrame().to_excel(xw, 'sheet11')

如果你得到空白表

sheet = xw.sheets['sheet11']

解决方案 12:

以下解决方案对我有用:

    # dataframe to save
    df = pd.DataFrame({"A":[1,2], "B":[3,4]})
    
    # path where you want to save
    path = "./..../..../.../test.xlsx"
    
    # if an excel sheet named `test` is already present append on sheet 2
    if os.path.isfile(path):  
      with pd.ExcelWriter(path, mode='a') as writer:
        df.to_excel(writer, sheet_name= "sheet_2")
    else:
    # if not present then write to a excel file on sheet 1
      with pd.ExcelWriter(path) as writer:
        df.to_excel(writer, sheet_name= "sheet_1")

现在,如果您想在不同的表格上写入多个数据框,只需添加一个循环并继续更改sheet_name

解决方案 13:

最简单的方法就是使用to_excelPandas 函数指定一个新sheet_name位置,用于将数据存储在现有的 Excel 文件中,并继续其他工作表。

path = 'input/existing_file.xlsx'
df_new_data = pd.read_excel('input/new_data.xlsx')

df_new_data.to_excel(path, sheet_name='New Data', index=False)

更新:我刚刚意识到,如果你这样做,就会重写你现有的 Excel 文件,删除其他工作表,只留下新的工作表。所以不幸的是,解决这个问题的唯一方法是使用xlsxwriter其他答案中建议的

解决方案 14:

import pandas as pd
import openpyxl

writer = pd.ExcelWriter('test.xlsx', engine='openpyxl')
data_df.to_excel(writer, 'sheet_name')
writer.save()
writer.close()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用