web-dev-qa-db-ja.com

1つのExcelワークシートに多数のpython pandasデータフレームを配置する

異なるワークシートである限り、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で1つのワークシートに多数のデータフレームを配置しようとしている場合、これが役立つことを願っています。

次に、これらの2つのコードブロックの違いを理解するのを手伝ってくれる人はいますか?コードの最初のブロックが "Validation"と呼ばれるワークシートを事前に作成したのを除いて、それらはほとんど同じであるように見えますが、2番目のブロックはそうではありません。その部分を手に入れました。

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

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

とにかくワークシートを作成します。その結果、コードの最終行に到達するまでに、ワークシート「Validation」も2番目のコードブロックに既に作成されています。それで、私の質問は基本的に、なぜコードの2番目のブロックが機能するのに最初のブロックが機能しないのですか?

組み込みのdf.to_Excel機能を使用して多くのデータフレームをExcelに配置する別の方法がある場合も共有してください!!

42
nyan314sn

事前にワークシートを作成するには、作成したシートをsheets dictに追加する必要があります:

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 function to_Excel]を見ると、ライターのwrite_cells関数が使用されています。

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

xlsxwriterwrite_cells関数を見てみましょう。

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_name内のself.sheetsをチェックしていることを確認できるため、そこにも追加する必要があります。

33
Adrian

user3817518:「組み込みのdf.to_Excel機能を使用してExcelに多くのデータフレームを配置する別の方法がある場合も共有してください!!」

これが私の試みです:

多くのデータフレームを1つのシートまたは複数のタブにまとめる簡単な方法。これが機能するかどうか教えてください!

-テストするには、サンプルデータフレームとコードの2番目と3番目の部分を実行するだけです。

サンプルデータフレーム

import pandas as pd
import numpy as np

# Sample dataframes    
randn = np.random.randn
df = pd.DataFrame(randn(15, 20))
df1 = pd.DataFrame(randn(10, 5))
df2 = pd.DataFrame(randn(5, 10))

複数のデータフレームを1つのxlsxシートに入れる

# funtion
def multiple_dfs(df_list, sheets, file_name, spaces):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    row = 0
    for dataframe in df_list:
        dataframe.to_Excel(writer,sheet_name=sheets,startrow=row , startcol=0)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

# list of dataframes
dfs = [df,df1,df2]

# run function
multiple_dfs(dfs, 'Validation', 'test1.xlsx', 1)

複数のデータフレームを別々のタブ/シートに配置する

# function
def dfs_tabs(df_list, sheet_list, file_name):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    for dataframe, sheet in Zip(df_list, sheet_list):
        dataframe.to_Excel(writer, sheet_name=sheet, startrow=0 , startcol=0)   
    writer.save()

# list of dataframes and sheet names
dfs = [df, df1, df2]
sheets = ['df','df1','df2']    

# run function
dfs_tabs(dfs, sheets, 'multi-test.xlsx')
29
TomDobbs

最初にデータフレームを連結してから、そのデータフレームをExcel形式に変換する傾向があります。 2つのデータフレームを(上下に並べるのではなく)並べて配置するには、次のようにします。

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)   
new_df = pd.concat([df, another_df], axis=1)
new_df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
1
Alex