Leer un archivo comprimido como un DataFrame de pandas


108

Estoy tratando de descomprimir un archivo csv y pasarlo a pandas para poder trabajar en el archivo.
El código que he probado hasta ahora es:

import requests, zipfile, StringIO
r = requests.get('http://data.octo.dc.gov/feeds/crime_incidents/archive/crime_incidents_2013_CSV.zip')
z = zipfile.ZipFile(StringIO.StringIO(r.content))
crime2013 = pandas.read_csv(z.read('crime_incidents_2013_CSV.csv'))

Después de la última línea, aunque Python puede obtener el archivo, aparece un "no existe" al final del error.

¿Alguien puede decirme qué estoy haciendo incorrectamente?

Respuestas:


159

Si desea leer un archivo comprimido o tar.gz en un marco de datos de pandas, los read_csvmétodos incluyen esta implementación en particular.

df = pd.read_csv('filename.zip')

O la forma larga:

df = pd.read_csv('filename.zip', compression='zip', header=0, sep=',', quotechar='"')

Descripción del argumento de compresión de los documentos :

compresión : {'inferir', 'gzip', 'bz2', 'zip', 'xz', None}, predeterminado 'infer' Para la descompresión sobre la marcha de datos en disco. Si 'infer' y filepath_or_buffer son similares a una ruta, detecte la compresión de las siguientes extensiones: '.gz', '.bz2', '.zip' o '.xz' (de lo contrario, no hay descompresión). Si usa 'zip', el archivo ZIP debe contener solo un archivo de datos para ser leído. Establezca en Ninguno para no descomprimir.

Nuevo en la versión 0.18.1: soporte para compresión 'zip' y 'xz'.


6
No hay soporte para archivos comprimidos, solo gzip y bz2. Esto es irritante porque el zip es bastante común. Me imagino que esto se debe a que zip no es de código abierto.
TC Proctor

24
zip ahora es compatible con pandas 0.18.1
nishant

1
Esta solución funciona para un archivo comprimido con gzip pero no para archivos .tar.gz (Pandas 0.19.2) ¡Tar.gz no es compatible con Pandas! Ver: github.com/pandas-dev/pandas/issues/…
tector

¿Podría decirnos si hay alguna razón en particular para usarlo quotechar?
Herpes Free Engineer

Esta respuesta muestra un .tar.gzarchivo, pero probablemente solo funcione con un .gzarchivo.
William Entriken

41

Creo que desea openel ZipFile, que devuelve un objeto similar a un archivo, en lugar de read:

In [11]: crime2013 = pd.read_csv(z.open('crime_incidents_2013_CSV.csv'))

In [12]: crime2013
Out[12]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 24567 entries, 0 to 24566
Data columns (total 15 columns):
CCN                            24567  non-null values
REPORTDATETIME                 24567  non-null values
SHIFT                          24567  non-null values
OFFENSE                        24567  non-null values
METHOD                         24567  non-null values
LASTMODIFIEDDATE               24567  non-null values
BLOCKSITEADDRESS               24567  non-null values
BLOCKXCOORD                    24567  non-null values
BLOCKYCOORD                    24567  non-null values
WARD                           24563  non-null values
ANC                            24567  non-null values
DISTRICT                       24567  non-null values
PSA                            24567  non-null values
NEIGHBORHOODCLUSTER            24263  non-null values
BUSINESSIMPROVEMENTDISTRICT    3613  non-null values
dtypes: float64(4), int64(1), object(10)

3
Nota: puede analizar las columnas de fecha al leer:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Andy Hayden

Para leer el primer archivo:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

Parece que ya ni siquiera tienes que especificar la compresión. El siguiente fragmento carga los datos de filename.zip en df.

import pandas as pd
df = pd.read_csv('filename.zip')

(Por supuesto, deberá especificar separador, encabezado, etc. si son diferentes de los predeterminados).


Esta debería ser la mejor respuesta, las otras están desactualizadas.
rjurney

12

Para archivos " zip ", puede usar import zipfiley su código funcionará simplemente con estas líneas:

import zipfile
import pandas as pd
with zipfile.ZipFile("Crime_Incidents_in_2013.zip") as z:
   with z.open("Crime_Incidents_in_2013.csv") as f:
      train = pd.read_csv(f, header=0, delimiter="\t")
      print(train.head())    # print the first 5 rows

Y el resultado será:

X,Y,CCN,REPORT_DAT,SHIFT,METHOD,OFFENSE,BLOCK,XBLOCK,YBLOCK,WARD,ANC,DISTRICT,PSA,NEIGHBORHOOD_CLUSTER,BLOCK_GROUP,CENSUS_TRACT,VOTING_PRECINCT,XCOORD,YCOORD,LATITUDE,LONGITUDE,BID,START_DATE,END_DATE,OBJECTID
0  -77.054968548763071,38.899775938598317,0925135...                                                                                                                                                               
1  -76.967309569035052,38.872119553647011,1003352...                                                                                                                                                               
2  -76.996184958456539,38.927921847721443,1101010...                                                                                                                                                               
3  -76.943077541353617,38.883686046653935,1104551...                                                                                                                                                               
4  -76.939209158039446,38.892278093281632,1125028...

0

https://www.kaggle.com/jboysen/quick-gz-pandas-tutorial

Siga este enlace.

import pandas as pd
traffic_station_df = pd.read_csv('C:\\Folders\\Jupiter_Feed.txt.gz', compression='gzip',
                                 header=1, sep='\t', quotechar='"')

#traffic_station_df['Address'] = 'address'

#traffic_station_df.append(traffic_station_df)
print(traffic_station_df)

¡Bienvenido a Stack Overflow! Si bien este código puede responder la pregunta, proporcionar contexto adicional ya sea como comentarios con el código o como un párrafo separado sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo.
Sardar Usama
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.