パンダを使用して、既存のExcelファイルに新しいシートを保存するにはどうすればよいですか?


90

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

このコードは、2つのDataFrameをそれぞれ「x1」と「x2」という名前の2つのシートに保存します。2つの新しいDataFrameを作成し、同じコードを使用して2つの新しいシート「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()

'x1'、 'x2'、 'x3'、 'x4'の4枚のExcelファイルが必要です。「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」を追加するのに最適な方法はどれですか。

回答:


121

ありがとうございました。完全な例は、同じ問題を抱えている他の人にとっては良いことだと思います。

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

このコードがその役目を果たします!


任意のアイデア、これを試してみると、次のようになります。ValueError:Excelライターがありません 'Sales Leads Calculations.xlsx'?
bernando_vialli 2018年

1
はい、これは既存のシートを一掃することなく、Excelにシートを追加することです。ありがとう!
Nikhil VJ 2018

2
Excelファイルを保存するときに、既存のExcelシート形式を保持するにはどうすればよいですか?
VineeshTP19年

3
誰もがこれと驚異を読み込む場合はどのように新しいものの名前を変更するのと同じ名前の既存のシートを代わりに上書きするには:行を追加し writer.sheets = dict((ws.title, ws) for ws in book.worksheets) た後 writer.book = book
害テモルダー

1
@Stefano Fedeleは、「openpyxl」の代わりに「xlsxwriter」を使用して、既存のExcelの同じ更新を実行できますか?
MNikesh19年

15

共有した例では、既存のファイルをにロードしbookwriter.book値をに設定していますbook。この行writer.sheets = dict((ws.title, ws) for ws in book.worksheets)では、ワークブックの各シートにとしてアクセスしていwsます。シートのタイトルはws{sheet_titles: sheet}キーと値のペアの辞書を作成するためのものです。次に、この辞書はwriter.sheetsに設定されます。基本的に、これらの手順は、既存のデータをそこからロードし、'Masterfile.xlsx'ライターにデータを入力するだけです。

ここx1x2、シートを含むファイルとシートとしてのファイルがすでにあるとします。サンプルコードを使用してファイルをロードし、次のように追加してx3を実行できますx4

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

それはあなたが探していることをするはずです。


任意のアイデア、これを試してみると、次のようになります。ValueError:Excelライターがありません 'Sales Leads Calculations.xlsx'?
bernando_vialli 2018年

18
これは、既存のシートを消去しています。
Nikhil VJ 2018

13

一度に優れた複数のデータを書き込むための簡単な例。また、書き込まれた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ファイルで別のシートにデータを「追加」したい場合は、シート名「3rd_sheet」に「df3」と言います。

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形式を使用できます。


1
この答えが何を追加するのかわかりません。実際、このようなコンテキストマネージャーを繰り返し使用すると、より多くのI / Oが必要になります。
チャーリークラーク

8

openpyxlはPandasDataFramesをサポートするようになったため、直接操作することを強くお勧めします。

これにより、関連するExcelおよびPandasコードに集中できます。


3
これに似た「パンダ」の例をもう少し追加できれば、本当に
助かり

私自身はパンダとあまり仕事をしていないので、それほど多くの例を提供することはできませんが、ドキュメントの改善を歓迎します。
チャーリークラーク

4

新しいファイルを作成するため

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

openpyxlのツールを使用して、ExcelWriterを使用せずにそれを行うことができます。これにより、新しいシートへのフォントの追加がはるかに簡単になります。 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)

これは素晴らしい解決策ですが、それが意味するものかどうかもわかりません。それはあなたがそれをすることができないということですか、ExcelWriterそれともあなたはただそうする必要がないということですか?
MattSom

Excelwriterでそれを行うことができますが、openpyxlを使用するだけで簡単になります。
JisMathew20年

2

「x1」、「x2」など、関心のある既存のシートをメモリに読み取り、新しいシートを追加する前に「書き戻す」ことができます(ファイル内のシートとメモリ内のシートは2つ異なることに注意してください)物事、あなたがそれらを読まなければ、それらは失われます)。このアプローチでは、「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)

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

2
優れていることを除いて、これが質問にどのように関連しているかについてはフォローしていません。
Artog

私は既存のワークブックを読み書きするための完全なソリューションを見つけるために働いていましたが、同じものを見つけることができませんでした。ここで、既存のワークブックへの書き込み方法に関するヒントを見つけたので、問題の完全な解決策を提供することを考えました。その明確なことを願っています。
nileshk6 1119

0

これを実行するもう1つの非常に簡単な方法は、次のようなメソッドを作成することです。

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の新しいシートとしてです。ブックが存在しない場合は作成されます。どちらもいるようですopenpyxlまたはxlsxwriterのAPPENDので、上記の@Stefanoによって例のように、あなたが本当にロードし、追加する書き換える必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.