1. ホーム
  2. python

多くの python pandas データフレームを 1 つの excel ワークシートに置く

2023-08-09 07:20:34

質問

異なるワークシートである限り、多くのpandasデータフレームをExcelワークブックに追加することは非常に簡単です。しかし、pandas組み込みのdf.to_excel機能を使用したい場合、1つのワークシートに多くのデータフレームを取得することはやや困難です。

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation') 
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

上記のコードは動作しません。以下のようなエラーが発生します。

 Sheetname 'Validation', with case ignored, is already in use.

さて、十分に実験した結果、うまくいく方法が見つかりました。

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   # Creating Excel Writer Object from Pandas  
workbook=writer.book
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

これはうまくいくでしょう。それで、stackoverflowにこの質問を投稿する目的は2つあります。まず、私は、彼/彼女がExcelで多くのデータフレームを単一のワークシートに入れようとしている場合、これが誰かの助けになることを願っています。

第二に、誰かがコードのこれらの2つのブロックの違いを理解するのを助けることができますか?最初のコードのブロックが事前に "Validation" と呼ばれるワークシートを作成したのに対して、2番目のコードがそうでないことを除いて、それらはほとんど同じであるように私には見えます。私はその部分を取得します。

私が理解していないのは、なぜ違うのか、ということです。たとえ私が事前にワークシートを作成しなくても、この行、最後の行の直前の行はそうです。

 df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)  

はとにかくワークシートを作成します。その結果、コードの最後の行に到達するまでに、ワークシート "Validation" はコードの2番目のブロックですでに同様に作成されています。 つまり、私の質問は基本的に、なぜ 2 番目のコードのブロックは動作し、1 番目のコードは動作しないのでしょうか?

組み込みのdf.to_excel機能を使用して、多くのデータフレームをエクセルに入れる他の方法があれば、それも共有してください!

どのように解決するのですか?

あらかじめワークシートを作成しておくには、作成したシートを sheets のディクショナリーを作成します。

writer.sheets['Validation'] = worksheet

元のコードを使って

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation')
writer.sheets['Validation'] = worksheet
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 


説明

pandasの関数である to_excel を見ると、これはライターの write_cells 関数を使用します。

excel_writer.write_cells(formatted_cells, sheet_name, startrow=startrow, startcol=startcol)

ということで write_cells の関数を見ると xlsxwriter :

def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
    # Write the frame cells using xlsxwriter.
    sheet_name = self._get_sheet_name(sheet_name)
    if sheet_name in self.sheets:
        wks = self.sheets[sheet_name]
    else:
        wks = self.book.add_worksheet(sheet_name)
        self.sheets[sheet_name] = wks

ここでは sheet_nameself.sheets であるため、そこにも追加する必要があります。