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

168

Tengo un archivo de hoja de cálculo grande (.xlsx) que estoy procesando con los pandas de Python. Sucede que necesito datos de dos pestañas en ese archivo grande. Una de las pestañas tiene una tonelada de datos y la otra son solo unas pocas celdas cuadradas.

Cuando uso pd.read_excel () en cualquier hoja de trabajo, me parece que todo el archivo está cargado (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 usemos la hoja especificada).

¿Lo estoy usando mal o solo está limitado de esta manera?

¡Gracias!

HaPsantran
fuente

Respuestas:

247

Prueba 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 forma de evitarlo ). Esto simplemente le ahorra tener que leer el mismo archivo cada vez que desea 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 hoja (por ejemplo, 0, 1, etc.), una lista de nombres o índices de hoja, o None. Si se proporciona una lista, devuelve un diccionario donde las claves son los nombres / índices de la hoja 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, todas las hojas se devuelven, como un {sheet_name:dataframe}diccionario.

Noé
fuente
44
FWIW, parece que (la última vez que lo probé) la primera línea se carga en todo , por lo que no hay forma de tirar de manera eficiente solo una sola hoja, pero al menos obtener varias hojas no requiere múltiples cargas de toda la hoja.
HaPsantran
1
Esta respuesta ha sido desaprobada por los pandas y ahora se bloquea para mí en v0.21.0. Debe ser reemplazado por el dado por @ Mat0kan.
DStauffman
1
@DStauffman Esto todavía funciona bien para mí y no veo ninguna indicación del código o los documentos de que esto esté en desuso. Si tiene problemas con él, enviaría un problema en el github para pandas o xlrd (la biblioteca de análisis de Python Excel utilizada por los pandas)
Noah
@Noah, gracias, investigé esto un poco más y tienes razón, todavía funciona mientras lo use sheet_namey no sheetname. No me di cuenta de que era la parte en desuso, porque todavía estaba trabajando en el método read_excel, pero no en el método de análisis.
DStauffman
@Noah De hecho, una buena respuesta. ¿Hay alguna manera de encontrar la celda activa en la hoja de Excel que lees?
Eswar
97

Hay 3 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)

Gracias @ihightower por señalarlo y @toto_tico por señalar el problema de la versión.

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 elija y cargue las sábanas.

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, sheetname="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)

Actualización: Gracias @toto_tico por señalar el problema de la versión.

sheetname: string, int, lista mixta de cadenas / ints, o None, por defecto 0 Desaprobado desde la versión 0.21.0: Use sheet_name en su lugar Source Link

Vikash Singh
fuente
12
en los últimos pandas que tengo (0.20.3), para leer todas las hojas en un mapa ... todo lo que se requiere es df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), esto tendrá las hojas en un diccionario automáticamente ... y accederá a la hoja como un marco de datos como este:df_sheet_map['house']
ihightower
32

También puede usar el índice para 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
fuente
77
En caso de que desee una lista de los nombres de las hojas, simplemente escriba xls.sheet_names
Stefano Fedele
28

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

cargará solo la hoja "sheet_name".

Mat0kan
fuente
9
pd.read_excel('filename.xlsx') 

de manera predeterminada, lea la primera hoja de trabajo.

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

lea la hoja específica del libro de trabajo y

pd.read_excel('filename.xlsx', sheet_name = None) 

lea todas las hojas de trabajo desde Excel hasta el marco de datos de pandas como un tipo de OrderedDict significa marcos de datos anidados, todas las hojas de trabajo como marcos de datos recopilados dentro del marco de datos y su tipo es OrderedDict.

Ashu007
fuente
1

Sí, desafortunadamente siempre cargará el archivo completo. Si está haciendo esto repetidamente, probablemente sea mejor extraer las hojas para separar los CSV y luego cargarlas por separado. Puede automatizar ese proceso con d6tstack que también agrega características adicionales como verificar si todas las columnas son iguales en todas las hojas o en varios archivos de Excel.

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

Ver ejemplos de Excel d6tstack

hombre de la ciudad
fuente
0

Si ha guardado el archivo de Excel en la misma carpeta que su programa Python (direccionamiento relativo), entonces solo necesita mencionar el número de hoja junto con el nombre del archivo. Sintaxis = pd.read_excel (Nombre de archivo, SheetNo) Ejemplo:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Nikita Agarwala
fuente