Lendo um arquivo do Excel em python usando pandas

144

Estou tentando ler um arquivo do Excel desta maneira:

newFile = pd.ExcelFile(PATH\FileName.xlsx)
ParsedData = pd.io.parsers.ExcelFile.parse(newFile)

que gera um erro que diz dois argumentos esperados, não sei qual é o segundo argumento e também o que estou tentando obter aqui é converter um arquivo do Excel em um DataFrame. Estou fazendo isso da maneira certa? ou existe alguma outra maneira de fazer isso usando pandas?

Rakesh Adhikesavan
fonte

Respostas:

223

Fechar: primeiro você chama ExcelFile, mas depois chama o .parsemétodo e passa o nome da planilha.

>>> xl = pd.ExcelFile("dummydata.xlsx")
>>> xl.sheet_names
[u'Sheet1', u'Sheet2', u'Sheet3']
>>> df = xl.parse("Sheet1")
>>> df.head()
                  Tid  dummy1    dummy2    dummy3    dummy4    dummy5  \
0 2006-09-01 00:00:00       0  5.894611  0.605211  3.842871  8.265307   
1 2006-09-01 01:00:00       0  5.712107  0.605211  3.416617  8.301360   
2 2006-09-01 02:00:00       0  5.105300  0.605211  3.090865  8.335395   
3 2006-09-01 03:00:00       0  4.098209  0.605211  3.198452  8.170187   
4 2006-09-01 04:00:00       0  3.338196  0.605211  2.970015  7.765058   

     dummy6  dummy7    dummy8    dummy9  
0  0.623354       0  2.579108  2.681728  
1  0.554211       0  7.210000  3.028614  
2  0.567841       0  6.940000  3.644147  
3  0.581470       0  6.630000  4.016155  
4  0.595100       0  6.350000  3.974442  

O que você está fazendo é chamar o método que reside na própria classe, e não na instância, o que é bom (embora não seja muito idiomático), mas se você estiver fazendo isso, também precisará passar o nome da planilha:

>>> parsed = pd.io.parsers.ExcelFile.parse(xl, "Sheet1")
>>> parsed.columns
Index([u'Tid', u'dummy1', u'dummy2', u'dummy3', u'dummy4', u'dummy5', u'dummy6', u'dummy7', u'dummy8', u'dummy9'], dtype=object)
DSM
fonte
6
quando eu uso "df = xl.parse (" Sheet1 ")", ele automaticamente pega o valor da primeira célula de cada coluna como o nome da coluna do dataframe, como especifico meus próprios nomes de coluna?
Rakesh Adhikesavan
2
No pandas 15.0.2, parsed = pd.io.parsers.ExcelFile.parse(xl, "Sheet1")não funciona e gera erro module object has no attribute ExcelFile. parsed = pd.io.excel.ExcelFile.parse(xl, "Sheet1")trabalha para mim
Neil
Agradável. Isso é quase tão elegante quanto a maneira como o mesmo acesso a uma guia é alcançado openpyxl. Os pandas estão chamando openpyxl sob o capô?
Pyderman 13/05
2
Como você evita que ela transforme a primeira linha em cabeçalhos? Eu tentei usar o parâmetro, headers=Nonemas, embora não tenha quebrado o código, também não funcionou.
Elliptica
8
Eu descobri que o pip install xlrd é necessário para que isso funcione. O pacote xlrd não é fornecido com os pandas; portanto, se você não o instalou para outro propósito, você receberá a exceção "ImportError: No module named xlrd". É verdade que a partir dos pandas 0.19.0 no Mac, de qualquer forma.
user5920660
95

Esta é uma maneira muito simples e fácil.

import pandas
df = pandas.read_excel(open('your_xls_xlsx_filename','rb'), sheetname='Sheet 1')
# or using sheet index starting 0
df = pandas.read_excel(open('your_xls_xlsx_filename','rb'), sheetname=2)

confira todos os detalhes da documentação http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.read_excel.html

FutureWarning: a sheetnamepalavra-chave foi descontinuada para versões mais recentes do Pandas, use em sheet_namevez disso.

Murali Mopuru
fonte
20

Pensei em acrescentar aqui que, se você quiser acessar linhas ou colunas para fazer um loop entre elas, faça o seguinte:

import pandas as pd

# open the file
xlsx = pd.ExcelFile(PATH\FileName.xlsx)

# get the first sheet as an object
sheet1 = xlsx.parse(0)

# get the first column as a list you can loop through
# where the is 0 in the code below change to the row or column number you want    
column = sheet1.icol(0).real

# get the first row as a list you can loop through
row = sheet1.irow(0).real

Editar:

Os métodos icol(i)e irow(i)estão obsoletos agora. Você pode usar sheet1.iloc[:,i]para obter a i-ésima coluna e sheet1.iloc[i,:]obter a i-ésima linha.

Dr. Manhattan
fonte
13

Eu acho que isso deve satisfazer sua necessidade:

import pandas as pd

# Read the excel sheet to pandas dataframe
DataFrame = pd.read_excel("PATH\FileName.xlsx", sheetname=0)
Ajay Sant
fonte
0

Você só precisa alimentar o caminho do seu arquivo para pd.read_excel

import pandas as pd

file_path = "./my_excel.xlsx"
data_frame = pd.read_excel(file_path)

Confira a documentação para explorar parâmetros como skiprowsignorar linhas ao carregar o excel

ted
fonte
0
import pandas as pd

data = pd.read_excel (r'**YourPath**.xlsx')

print (data)
Suthura Sudharaka
fonte
0

Aqui está um método atualizado com sintaxe que é mais comum no código python. Também impede que você abra o mesmo arquivo várias vezes.

import pandas as pd

sheet1, sheet2 = None, None
with pd.ExcelFile("PATH\FileName.xlsx") as reader:
    sheet1 = pd.read_excel(reader, sheet_name='Sheet1')
    sheet2 = pd.read_excel(reader, sheet_name='Sheet2')

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html

Quinn
fonte