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?

usuario2793667
fuente

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

Suchit
fuente
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)
Andy Hayden
fuente
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).

TDS
fuente
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...
imanzabet
fuente
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)
Suryakanta Karan
fuente
¡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