簡體   English   中英

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

[英]How to save a new sheet in an existing excel file, using Pandas?

我想使用 excel 文件來存儲用 python 詳細說明的數據。 我的問題是我無法將工作表添加到現有的 excel 文件中。 在這里,我建議使用示例代碼來解決此問題

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_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\fedel\Desktop\excelData\PhD_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”的最佳方法是什么?

謝謝你。 我相信一個完整的例子可能對其他有同樣問題的人有好處:

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_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()

這里我生成了一個excel文件,根據我的理解,它是通過“xslxwriter”還是“openpyxl”引擎生成的並不重要。

當我想在不丟失原始數據的情況下寫入時

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

path = r"C:\Users\fedel\Desktop\excelData\PhD_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.save()
writer.close()

這段代碼做的工作!

在您共享的示例中,您將現有文件加載到book並將writer.book值設置為book writer.sheets = dict((ws.title, ws) for ws in book.worksheets)您將工作簿中的每個工作表作為ws訪問。 然后工作表標題是ws因此您正在創建{sheet_titles: sheet}鍵值對的字典。 然后將該詞典設置為 writer.sheets。 本質上,這些步驟只是從'Masterfile.xlsx'加載現有數據並用它們填充您'Masterfile.xlsx'

現在假設您已經有一個包含x1x2作為工作表的文件。 您可以使用示例代碼加載文件,然后可以執行類似的操作來添加x3x4

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

那應該做你正在尋找的。

一次將多個數據寫入 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之一。

用於創建新文件

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

要附加到文件,請在pd.ExcelWriter使用參數mode='a'

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' 請參閱文檔

我強烈建議您直接使用openpyxl,因為它現在支持 Pandas DataFrames

這使您可以專注於相關的 Excel 和 Pandas 代碼。

可以在不使用 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:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.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)

您可以將您感興趣的現有工作表(例如,“x1”、“x2”)讀入內存並在添加更多新工作表之前將它們“寫回”(請記住,文件中的工作表和內存中的工作表是兩種不同的東西,如果你不讀它們,它們就會丟失)。 此方法僅使用“xlsxwriter”,不涉及 openpyxl。

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_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()

如果要保留所有現有工作表,可以將開始和結束之間的上述代碼替換為:

# 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)

另一種相當簡單的方法是創建一個這樣的方法:

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 的示例中,您確實必須加載然后重寫才能追加。

#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:\Users\xyz\Desktop\Python\

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:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

每次你想將 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)

如果你想添加空工作表

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

如果你得到空紙

sheet = xw.sheets['sheet11']

以下解決方案對我有用:

df = pd.DataFrame({"A":[1,2], "B":[3,4]})

path = "./..../..../.../test.xlsx"

if os.path.isfile(path):  
  with pd.ExcelWriter(path, mode='a') as writer:
    df.to_excel(writer, sheet_name= "sheet_2")
else:
  with pd.ExcelWriter(path) as writer:
    df.to_excel(writer, sheet_name= "sheet_1")
import pandas as pd
import openpyxl

writer = pd.ExcelWriter('test.xlsx', engine='openpyxl')
data_df.to_excel(writer, 'sheet_name')
writer.save()
writer.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM