Usando Pandas para pd.read_excel() para múltiples hojas de trabajo del mismo libro

Resuelto HaPsantran asked hace 9 años • 14 respuestas

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

HaPsantran avatar Oct 23 '14 11:10 HaPsantran
Aceptado

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_nameargumento 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 Nonese especifica, se devuelven todas{sheet_name:dataframe} las hojas, como un diccionario.

Noah avatar Oct 23 '2014 05:10 Noah

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

Vikash Singh avatar Sep 06 '2017 18:09 Vikash Singh

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".

Mat0kan avatar Feb 11 '2017 19:02 Mat0kan

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)
Elliott avatar Feb 25 '2015 22:02 Elliott

Hay varias opciones según el caso de uso:

  1. Si uno no sabe los nombres de las hojas.

  2. Si el nombre de las hojas no es relevante.

  3. 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, Sheet2y 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.concatfunciona ( Fuente ):

    ingrese la descripción de la imagen aquí

  • 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 ExcelFileclase de la siguiente manera

    sheets = pd.ExcelFile('FILENAME.xlsx').sheet_names
    
    [Out]: ['Sheet1', 'Sheet2', 'Sheet3']
    
  • En este caso, se supone que el archivo FILENAME.xlsxestá 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, como pathla siguiente

       path = r'./Data/Test.xlsx'
      
       df = pd.read_excel(r'./Data/FILENAME.xlsx', sheet_name=None)
      
  • Esta podría ser una lectura relevante.

Gonçalo Peres avatar Nov 24 '2020 12:11 Gonçalo Peres