2014-10-23 18 views
31

Ho un file di foglio di calcolo (.xlsx) che sto elaborando usando i panda python. Succede che ho bisogno di dati da due schede in quel file di grandi dimensioni. Una delle schede ha una tonnellata di dati e l'altra è composta da poche celle quadrate.Utilizzo di panda su pd.read_excel() per più fogli di lavoro della stessa cartella di lavoro

Quando uso pd.read_excel() su qualsiasi foglio di lavoro, sembra a me come l'intero file viene caricato (non solo il foglio di lavoro che mi interessa). Quindi quando uso il metodo due volte (una volta per ogni foglio), devo effettivamente subire l'intera cartella di lavoro in lettura due volte (anche se stiamo usando solo il foglio specificato).

Sto usando male o è limitato in questo modo?

Grazie!

risposta

39

Prova pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls') 
df1 = pd.read_excel(xls, 'Sheet1') 
df2 = pd.read_excel(xls, 'Sheet2') 

Come notato da @HaPsantran, l'intero file di Excel viene letto durante la chiamata ExcelFile() (non sembra essere un modo per aggirare questo). Ciò ti evita semplicemente di dover leggere lo stesso file ogni volta che vuoi accedere a un nuovo foglio.

nota che l'argomento sheet_name a pd.read_excel() può essere il nome del foglio (come sopra), un intero che specifica il numero di foglio (ad esempio 0, 1, ecc), un elenco dei nomi di foglio o indici o None. Se viene fornito un elenco, restituisce un dizionario in cui le chiavi sono i nomi/gli indici dei fogli ei valori sono i frame dei dati. L'impostazione predefinita è semplicemente restituire il primo foglio (ovvero, sheet_name=0).

Se è specificato None, vengono restituiti tutti i fogli, come dizionario {sheet_name:dataframe}.

+1

FWIW, sembra che (l'ultima volta che ho testato) i primi di linea carichi in * tutto *, quindi non c'è alcun modo di tirare in modo efficiente solo un singolo foglio, ma almeno ottenere più fogli non richiede più carichi dell'intero foglio. – HaPsantran

+0

Questa risposta è stata deprecata dai panda e ora si blocca per me in v0.21.0. Dovrebbe essere sostituito da quello indicato da @ Mat0kan. – DStauffman

+0

@DStauffman Questo funziona ancora bene per me e non vedo alcuna indicazione dal codice o dai documenti che questo sia deprecato. Se hai problemi con questo, vorrei sottoporre un problema al github per pandas o xlrd (la libreria di parsing excel python usata dai panda) – Noah

17

È anche possibile utilizzare l'indice per il foglio:

xls = pd.ExcelFile('path_to_file.xls') 
sheet1 = xls.parse(0) 

darà il primo foglio. per il secondo foglio di lavoro:

sheet2 = xls.parse(1) 
+4

Nel caso in cui si desideri un elenco dei nomi dei fogli, basta digitare xls.sheet_names –

11

Si può anche specificare il nome del foglio come parametro:

data_file = pd.read_excel('path_to_file.xls', sheetname="sheet_name") 

caricherà solo il foglio "SHEET_NAME"

9

ci sono 3 opzioni:

  1. Leggere il primo foglio direttamente nel dataframe
  2. Leggi il file excel e ottieni un elenco di fogli. Quindi scegli e carica i fogli.
  3. Leggi tutti i fogli e memorizzali in un dizionario.

codice di esempio:

import pandas as pd 

df = pd.read_excel('excel_file_path.xls') 
# this will read the first sheet into df 

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

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

UPDATE:

# @ihightower pointed out in the comments that all sheets can be 
# directly read into an ordered dictionary in 1 step 
sheet_to_df_map = pd.read_excel(file_name, sheetname=None) 
+3

negli ultimi panda che ho (0.20.3), per leggere tutti i fogli su una mappa .. tutto ciò che è richiesto è 'df_sheet_map = pd .read_excel (file_fullpath, sheetname = None) ', questo avrà automaticamente i fogli in un dizionario .. e accederà al foglio come dataframe in questo modo:' df_sheet_map ['house'] ' – ihightower

Problemi correlati