Usando o Pandas para pd.read_excel () para várias planilhas da mesma pasta de trabalho

168

Eu tenho um arquivo grande de planilha (.xlsx) que estou processando usando pandas python. Acontece que eu preciso de dados de duas guias nesse arquivo grande. Uma das guias possui uma tonelada de dados e a outra são apenas algumas células quadradas.

Quando uso pd.read_excel () em qualquer planilha, parece-me que o arquivo inteiro foi carregado (não apenas a planilha em que estou interessado). Portanto, quando eu uso o método duas vezes (uma vez para cada planilha), efetivamente preciso que toda a pasta de trabalho seja lida duas vezes (mesmo que esteja usando apenas a planilha especificada).

Estou usando errado ou é apenas limitado dessa maneira?

Obrigado!

HaPsantran
fonte
Veja este stackoverflow.com/a/61267822/6117565
bikram 17/04

Respostas:

247

Tente pd.ExcelFile:

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

Conforme observado por @HaPsantran, todo o arquivo do Excel é lido durante a ExcelFile()chamada (não parece haver uma maneira de contornar isso). Isso evita que você precise ler o mesmo arquivo sempre que quiser acessar uma nova planilha.

Observe que o sheet_nameargumento para pd.read_excel()pode ser o nome da planilha (como acima), um número inteiro especificando o número da planilha (por exemplo, 0, 1, etc), uma lista de nomes ou índices da planilha ou None. Se uma lista for fornecida, ele retornará um dicionário onde as chaves são os nomes / índices da planilha e os valores são os quadros de dados. O padrão é simplesmente retornar a primeira planilha (ou seja, sheet_name=0).

Se Nonefor especificado, todas as planilhas serão retornadas, como um {sheet_name:dataframe}dicionário.

Noé
fonte
4
FWIW, parece que (da última vez que o testei) a primeira linha é carregada em tudo , então não há como puxar com eficiência apenas uma única folha, mas pelo menos obter várias folhas não requer várias cargas da folha inteira.
HaPsantran
1
Esta resposta foi preterida pelos pandas e agora trava para mim na v0.21.0. Deve ser substituído pelo fornecido por @ Mat0kan.
DStauffman
1
@DStauffman Isso ainda funciona bem para mim e não vejo nenhuma indicação do código ou dos documentos de que isso foi descontinuado. Se você está tendo problemas com ele, eu enviar um problema no github para pandas ou xlrd (a biblioteca analisar python excel usado por pandas)
Noah
@Noah, obrigado, olhei para isso um pouco mais e você está certo, ele ainda funciona desde que eu use sheet_namee não sheetname. Não percebi que essa era a parte descontinuada, porque ainda estava trabalhando no método read_excel, mas não no método de análise.
DStauffman
@ Noah De fato, uma boa resposta. Existe uma maneira de encontrar a célula ativa na planilha do Excel que você lê?
Eswar
97

Existem 3 opções:

Leia todas as folhas diretamente em um dicionário 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)

Obrigado @ihightower por apontá-lo e @toto_tico por apontar o problema da versão.

Leia a primeira planilha diretamente no dataframe

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

Leia o arquivo do Excel e obtenha uma lista de folhas. Depois escolha e carregue as folhas.

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

Leia todas as folhas e guarde-as em um dicionário. O mesmo que o primeiro, mas mais 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)

Atualização: Obrigado @toto_tico por apontar o problema da versão.

sheetname: string, int, lista mista de strings / ints, ou None, padrão 0 Descontinuado desde a versão 0.21.0: Use sheet_name em vez disso Source Link

Vikash Singh
fonte
12
nos pandas mais recentes que eu tenho (0.20.3), para ler todas as planilhas em um mapa .. tudo o que é necessário é que df_sheet_map = pd.read_excel(file_fullpath, sheetname=None)isso tenha as planilhas em um dicionário automaticamente .. e acesse a planilha como dataframe assim:df_sheet_map['house']
ihightower
32

Você também pode usar o índice para a planilha:

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

dará a primeira planilha. para a segunda planilha:

sheet2 = xls.parse(1)
Elliott
fonte
7
No caso de pretender uma lista dos nomes das folhas, do que apenas digitar xls.sheet_names
Stefano Fedele
28

Você também pode especificar o nome da planilha como um parâmetro:

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

fará o upload apenas da planilha "sheet_name".

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

por padrão, leia a primeira planilha da pasta de trabalho.

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

leia a folha específica da pasta de trabalho e

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

leia todas as planilhas do excel para o panda dataframe como um tipo de OrderedDict significa quadros de dados aninhados, todas as planilhas como quadros de dados coletados no dataframe e seu tipo é OrderedDict.

Ashu007
fonte
1

Sim, infelizmente, ele sempre carregará o arquivo completo. Se você estiver fazendo isso repetidamente, provavelmente é melhor extrair as folhas para separar os CSVs e depois carregar separadamente. Você pode automatizar esse processo com o d6tstack, que também adiciona recursos adicionais, como verificar se todas as colunas são iguais em todas as planilhas ou vários arquivos do Excel.

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

Veja exemplos do d6tstack Excel

citynorman
fonte
0

Se você salvou o arquivo do Excel na mesma pasta que o seu programa python (Endereçamento Relativo), basta mencionar o número da planilha e o nome do arquivo. Sintaxe = pd.read_excel (Nome do arquivo, SheetNo) Exemplo:

    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
fonte