Usando Pandas para pd.read_excel() para múltiples hojas de trabajo del mismo libro
Tengo un archivo de hoja de cálculo grande (.xlsx) que estoy procesando usando Python Pandas. Sucede que necesito datos de dos pestañas (hojas) en ese archivo tan grande. Una de las pestañas tiene una gran cantidad de datos y la otra tiene solo unas pocas celdas cuadradas.
Cuando lo uso pd.read_excel()
en cualquier hoja de trabajo, me parece que se carga todo el archivo (no solo la hoja de trabajo que me interesa). Entonces, cuando uso el método dos veces (una para cada hoja), efectivamente tengo que sufrir que todo el libro se lea dos veces (aunque solo estemos usando la hoja especificada).
¿Cómo cargo solo hojas específicas con pd.read_excel()
?
Intentar pd.ExcelFile
:
xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')
Como señaló @HaPsantran, todo el archivo de Excel se lee durante la ExcelFile()
llamada (no parece haber una manera de evitar esto). Esto simplemente le evita tener que leer el mismo archivo cada vez que desee acceder a una nueva hoja.
Tenga en cuenta que el sheet_name
argumento pd.read_excel()
puede ser el nombre de la hoja (como arriba), un número entero que especifica el número de la hoja (por ejemplo, 0, 1, etc.), una lista de nombres o índices de hojas, o None
. Si se proporciona una lista, devuelve un diccionario donde las claves son los nombres/índices de las hojas y los valores son los marcos de datos. El valor predeterminado es simplemente devolver la primera hoja (es decir, sheet_name=0
).
Si None
se especifica, se devuelven todas{sheet_name:dataframe}
las hojas, como un diccionario.
Hay algunas opciones:
Lea todas las hojas directamente en un diccionario ordenado.
import pandas as pd
# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)
# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)
Lea la primera hoja directamente en el marco de datos.
df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df
Lea el archivo de Excel y obtenga una lista de hojas. Luego elige y carga las hojas.
xls = pd.ExcelFile('excel_file_path.xls')
# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]
# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheet_name="house")
Lea todas las hojas y guárdelas en un diccionario. Igual que el primero pero más explícito.
# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
# you can also use sheet_index [0,1,2..] instead of sheet name.
Gracias @ihightower por señalar la forma de leer todas las hojas y @toto_tico, @red-headphone por señalar el problema de la versión.
nombre de hoja: cadena, int, lista mixta de cadenas/ints, o Ninguno, predeterminado 0 En desuso desde la versión 0.21.0: use nombre de hoja en lugar de Enlace de origen
También puede especificar el nombre de la hoja como parámetro:
data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")
Subirá sólo la hoja "sheet_name"
.
También puedes utilizar el índice de la hoja:
xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)
Le dará la primera hoja de trabajo. para la segunda hoja de trabajo:
sheet2 = xls.parse(1)
Hay varias opciones según el caso de uso:
Si uno no sabe los nombres de las hojas.
Si el nombre de las hojas no es relevante.
Si uno sabe el nombre de las hojas.
A continuación veremos detenidamente cada una de las opciones.
Consulte la sección Notas para obtener información como averiguar los nombres de las hojas.
Opción 1
Si uno no sabe los nombres de las hojas
# Read all sheets in your File
df = pd.read_excel('FILENAME.xlsx', sheet_name=None)
# Prints all the sheets name in an ordered dictionary
print(df.keys())
Luego, dependiendo de la hoja que se quiera leer, se puede pasar cada una de ellas a una carpeta específica dataframe
, como por ejemplo
sheet1_df = pd.read_excel('FILENAME.xlsx', sheet_name=SHEET1NAME)
sheet2_df = pd.read_excel('FILENAME.xlsx', sheet_name=SHEET2NAME)
opcion 2
Si el nombre no es relevante y lo único que le importa es la posición de la hoja. Digamos que uno quiere sólo la primera hoja.
# Read all sheets in your File
df = pd.read_excel('FILENAME.xlsx', sheet_name=None)
sheet1 = list(df.keys())[0]
Luego, dependiendo del nombre de la hoja, se puede pasar cada una a un archivo específico dataframe
, como por ejemplo
sheet1_df = pd.read_excel('FILENAME.xlsx', sheet_name=SHEET1NAME)
Opción 3
Aquí consideraremos el caso en el que se conoce el nombre de las hojas. Para los ejemplos, se considerará que hay tres hojas denominadas Sheet1
, Sheet2
y Sheet3
. El contenido en cada uno es el mismo y se ve así.
0 1 2
0 85 January 2000
1 95 February 2001
2 105 March 2002
3 115 April 2003
4 125 May 2004
5 135 June 2005
Con esto, dependiendo de los objetivos de cada uno, existen múltiples enfoques:
Almacene todo en el mismo marco de datos. Un enfoque sería combinar las hojas de la siguiente manera
sheets = ['Sheet1', 'Sheet2', 'Sheet3'] df = pd.concat([pd.read_excel('FILENAME.xlsx', sheet_name = sheet) for sheet in sheets], ignore_index = True) [Out]: 0 1 2 0 85 January 2000 1 95 February 2001 2 105 March 2002 3 115 April 2003 4 125 May 2004 5 135 June 2005 6 85 January 2000 7 95 February 2001 8 105 March 2002 9 115 April 2003 10 125 May 2004 11 135 June 2005 12 85 January 2000 13 95 February 2001 14 105 March 2002 15 115 April 2003 16 125 May 2004 17 135 June 2005
Básicamente, así
pandas.concat
funciona ( Fuente ):Almacene cada hoja en un marco de datos diferente (digamos,
df1
,df2
...)sheets = ['Sheet1', 'Sheet2', 'Sheet3'] for i, sheet in enumerate(sheets): globals()['df' + str(i + 1)] = pd.read_excel('FILENAME.xlsx', sheet_name = sheet) [Out]: # df1 0 1 2 0 85 January 2000 1 95 February 2001 2 105 March 2002 3 115 April 2003 4 125 May 2004 5 135 June 2005 # df2 0 1 2 0 85 January 2000 1 95 February 2001 2 105 March 2002 3 115 April 2003 4 125 May 2004 5 135 June 2005 # df3 0 1 2 0 85 January 2000 1 95 February 2001 2 105 March 2002 3 115 April 2003 4 125 May 2004 5 135 June 2005
Notas:
Si uno quiere saber los nombres de las hojas, puede usar la
ExcelFile
clase de la siguiente manerasheets = pd.ExcelFile('FILENAME.xlsx').sheet_names [Out]: ['Sheet1', 'Sheet2', 'Sheet3']
En este caso, se supone que el archivo
FILENAME.xlsx
está en el mismo directorio que el script que se está ejecutando.Si el archivo está en una carpeta del directorio actual llamada Datos, una forma sería
r'./Data/FILENAME.xlsx'
crear una variable, comopath
la siguientepath = r'./Data/Test.xlsx' df = pd.read_excel(r'./Data/FILENAME.xlsx', sheet_name=None)
Esta podría ser una lectura relevante.