python - tutorial - Poniendo muchos marcos de datos de pandas de pitón en una hoja de cálculo de Excel
promedio pandas python (3)
Me inclinaría más a concatenar los marcos de datos primero y luego convertir ese marco de datos en un formato de Excel. Para juntar dos marcos de datos uno al lado del otro (en lugar de uno encima del otro) haga esto:
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)
Es bastante fácil agregar muchos marcos de datos de pandas en el libro de trabajo de Excel, siempre que se trate de diferentes hojas de trabajo. Sin embargo, es algo complicado obtener muchos dataframes en una hoja de trabajo si desea usar la funcionalidad panda integrada df.to_excel.
# 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)
El código anterior no funcionará. Obtendrás el error de
Sheetname ''Validation'', with case ignored, is already in use.
Ahora, he experimentado lo suficiente como para encontrar una forma de hacerlo funcionar.
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)
Esto funcionará Por lo tanto, mi propósito de publicar esta pregunta en stackoverflow es doble. En primer lugar, espero que esto ayude a alguien si está tratando de poner muchos dataframes en una sola hoja de trabajo en Excel.
En segundo lugar, ¿alguien puede ayudarme a entender la diferencia entre esos dos bloques de código? Me parece que son prácticamente iguales, excepto que el primer bloque de código creó una hoja de trabajo llamada "Validación" por adelantado, mientras que el segundo no. Yo entiendo esa parte.
Lo que no entiendo es por qué debería ser diferente? Incluso si no creo la hoja de cálculo de antemano, esta línea, la línea justo antes de la última,
df.to_excel(writer,sheet_name=''Validation'',startrow=0 , startcol=0)
creará una hoja de trabajo de todos modos. En consecuencia, cuando llegamos a la última línea de código, ya se creó la hoja de trabajo "Validación" en el segundo bloque de código. Entonces, mi pregunta básicamente, ¿por qué debería funcionar el segundo bloque de código mientras que el primero no?
¡Por favor también comparta si hay otra manera de poner muchos dataframes en Excel usando la funcionalidad integrada df.to_excel!
user3817518: "¡Por favor también comparta si hay otra manera de poner muchos dataframes en Excel usando la funcionalidad integrada df.to_excel!"
Aquí está mi intento:
Una manera fácil de juntar muchos dataframes en una sola hoja o en varias pestañas. ¡Hazme saber si esto funciona!
- Para probar, simplemente ejecute los marcos de datos de muestra y la segunda y tercera parte del código.
Marcos de datos de muestra
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))
Pon múltiples dataframes en una sola hoja 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)
Pon múltiples marcos de datos en pestañas / hojas separadas
# 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'')
Para crear la hoja de trabajo por adelantado, debe agregar la hoja creada al dict de sheets
:
writer.sheets[''Validation''] = worksheet
Usando tu código original:
# 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)
Explicación
Si observamos la función to_excel
, utiliza la función to_excel
del escritor:
excel_writer.write_cells(formatted_cells, sheet_name, startrow=startrow, startcol=startcol)
Entonces, mirando la función xlsxwriter
para 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
Aquí podemos ver que comprueba el nombre de la sheet_name
en self.sheets
, por lo que debe agregarse allí también.