Utilizzo di Panda per pd.read_excel () per più fogli di lavoro della stessa cartella di lavoro


168

Ho un grande file di foglio di calcolo (.xlsx) che sto elaborando usando 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 è solo poche celle quadrate.

Quando uso pd.read_excel () su qualsiasi foglio di lavoro, mi sembra che l'intero file sia 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 lettura della cartella di lavoro due volte (anche se stiamo usando solo il foglio specificato).

Lo sto usando male o è solo limitato in questo modo?

Grazie!


Risposte:


247

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 Excel viene letto durante la ExcelFile()chiamata (non sembra esserci un modo per aggirare questo). Questo semplicemente ti salva dal dover leggere lo stesso file ogni volta che vuoi accedere a un nuovo foglio.

Si noti che l' sheet_nameargomento pd.read_excel()può essere il nome del foglio (come sopra), un numero intero che specifica il numero del foglio (ad es. 0, 1, ecc.), Un elenco di nomi o indici del foglio, oppure None. Se viene fornito un elenco, viene restituito un dizionario in cui le chiavi sono i nomi / indici del foglio e i valori sono i frame di dati. L'impostazione predefinita è semplicemente restituire il primo foglio (ovvero, sheet_name=0).

Se Nonespecificato, tutti i fogli vengono restituiti, come a{sheet_name:dataframe} dizionario.


4
A proposito, sembra (l'ultima volta che l'ho provato) la prima riga si carica in tutto , quindi non c'è modo di tirare in modo efficiente solo un singolo foglio, ma almeno ottenere più fogli non richiede più carichi dell'intero foglio.
HaPsantran,

1
Questa risposta è stata deprecata dai panda e ora si blocca per me nella v0.21.0. Dovrebbe essere sostituito da quello dato da @ Mat0kan.
DStauffman,

1
@DStauffman Questo funziona ancora bene per me e non vedo alcuna indicazione dal codice o dai documenti che questo è deprecato. Se hai problemi con esso, presenterei un problema sul github per i panda o xlrd (la libreria di analisi di python excel usata dai panda)
Noah

@Noah, grazie, ho esaminato ancora un po 'questo e hai ragione, funziona ancora fintanto che io uso sheet_namee non sheetname. Non mi rendevo conto che quella era la parte deprecata, perché stava ancora lavorando sul metodo read_excel, ma non sul metodo di analisi.
DStauffman,

@Noah Davvero una bella risposta. C'è un modo per trovare la cella attiva nel foglio Excel che hai letto?
Eswar,

97

Sono disponibili 3 opzioni:

Leggi tutti i fogli direttamente in un dizionario ordinato.

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)

Grazie a @ihightower per averlo segnalato e @toto_tico per aver segnalato il problema della versione.

Leggi il primo foglio direttamente nel frame di dati

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

Leggi il file Excel e ottieni un elenco di fogli. Quindi scegli e carica i fogli.

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

Leggi tutti i fogli e salvali in un dizionario. Come il primo ma più esplicito.

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

Aggiornamento: grazie @toto_tico per aver segnalato il problema della versione.

nome foglio: stringa, int, elenco misto di stringhe / ints o Nessuno, impostazione predefinita 0 obsoleto dalla versione 0.21.0: utilizzare invece nome_pagina anziché il collegamento di origine


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

32

Puoi anche utilizzare l'indice per il foglio:

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

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

sheet2 = xls.parse(1)

7
Nel caso in cui desideri un elenco dei nomi dei fogli, basta digitare xls.sheet_names
Stefano Fedele,

28

È inoltre possibile specificare il nome del foglio come parametro:

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

caricherà solo il foglio "sheet_name".


9
pd.read_excel('filename.xlsx') 

per impostazione predefinita leggere il primo foglio di lavoro.

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

leggere il foglio di lavoro specifico e

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

leggi tutti i fogli di lavoro da Excel a Panda Dataframe come un tipo di OrderedDict significa frame di dati nidificati, tutti i fogli di lavoro come frame di dati raccolti all'interno di Dataframe e il suo tipo è OrderedDict.


1

Sì, sfortunatamente caricherà sempre il file completo. Se lo fai ripetutamente, probabilmente è meglio estrarre i fogli in CSV separati e quindi caricarli separatamente. Puoi automatizzare quel processo con d6tstack che aggiunge anche funzionalità aggiuntive come il controllo se tutte le colonne sono uguali su tutti i fogli o più file Excel.

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

Vedi d6tstack esempi di Excel


0

Se hai salvato il file Excel nella stessa cartella del tuo programma Python (indirizzamento relativo), devi solo menzionare il numero del foglio insieme al nome del file. Sintassi = pd.read_excel (Nome file, Foglio n.) Esempio:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.