Lectura de un archivo de Excel en Python usando pandas

144

Estoy tratando de leer un archivo de Excel de esta manera:

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

que arroja un error que dice que se esperan dos argumentos, no sé cuál es el segundo argumento y también lo que estoy tratando de lograr aquí es convertir un archivo de Excel a un DataFrame, ¿lo estoy haciendo de la manera correcta? ¿O hay alguna otra manera de hacer esto usando pandas?

Rakesh Adhikesavan
fuente

Respuestas:

223

Cerrar: primero llama ExcelFile, pero luego llama al .parsemétodo y le pasa el nombre de la hoja.

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

Lo que está haciendo es llamar al método que vive en la clase en sí, en lugar de la instancia, lo cual está bien (aunque no es muy idiomático), pero si lo hace, también necesitaría pasar el nombre de la hoja:

>>> 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
fuente
66
cuando uso "df = xl.parse (" Sheet1 ")" toma automáticamente el valor de la primera celda de cada columna como los nombres de columna del marco de datos, ¿cómo puedo especificar mis propios nombres de columna?
Rakesh Adhikesavan
2
En pandas 15.0.2, parsed = pd.io.parsers.ExcelFile.parse(xl, "Sheet1")no funciona y arroja error module object has no attribute ExcelFile. parsed = pd.io.excel.ExcelFile.parse(xl, "Sheet1")funciona para mí
Neil
Agradable. Esto es casi tan claro como cómo se logra el mismo acceso a una pestaña openpyxl. ¿Están los pandas llamando a openpyxl debajo del capó?
Pyderman
2
¿Cómo evita que convierta la primera fila en encabezados? Intenté usar el parámetro, headers=Nonepero aunque no rompió el código, tampoco funcionó.
Elliptica
8
Descubrí que pip install xlrd es necesario para que esto funcione. El paquete xlrd no viene con pandas, por lo que si no lo instaló para algún otro propósito, obtendrá una excepción "ImportError: No module named xlrd". Verdadero a partir de pandas 0.19.0 en Mac, en cualquier caso.
user5920660
95

Esta es una manera muy simple y 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)

consulte los detalles completos de la documentación http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.read_excel.html

Advertencia del futuro: la sheetnamepalabra clave está en desuso para las versiones más recientes de Pandas, úsela sheet_nameen su lugar.

Murali Mopuru
fuente
20

Pensé que debería agregar aquí, que si desea acceder a filas o columnas para recorrerlas, haga esto:

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:

Los métodos icol(i)y irow(i)están en desuso ahora. Puede usar sheet1.iloc[:,i]para obtener la i-ésima columna y sheet1.iloc[i,:]obtener la i-ésima fila.

Dr Manhattan
fuente
13

Creo que esto debería satisfacer su necesidad:

import pandas as pd

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

Solo necesita alimentar la ruta de su archivo a pd.read_excel

import pandas as pd

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

Verifique la documentación para explorar parámetros como skiprowsignorar filas al cargar Excel

ted
fuente
0
import pandas as pd

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

print (data)
Suthura Sudharaka
fuente
0

Aquí hay un método actualizado con sintaxis que es más común en el código python. También le impide abrir el mismo archivo varias veces.

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
fuente