Leggi un file zippato come DataFrame panda


108

Sto cercando di decomprimere un file CSV e passarlo a Panda in modo da poter lavorare sul file.
Il codice che ho provato finora è:

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

Dopo l'ultima riga, sebbene python sia in grado di ottenere il file, ottengo un "non esiste" alla fine dell'errore.

Qualcuno può dirmi cosa sto facendo in modo errato?

Risposte:


159

Se vuoi leggere un file zippato o tar.gz nel dataframe pandas, i read_csvmetodi includono questa particolare implementazione.

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

O la forma lunga:

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

Descrizione dell'argomento di compressione dalla documentazione :

compressione : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, default 'infer' Per la decompressione al volo dei dati su disco. Se "infer" e filepath_or_buffer è simile a un percorso, rileva la compressione dalle seguenti estensioni: ".gz", ".bz2", ".zip" o ".xz" (altrimenti nessuna decompressione). Se si utilizza "zip", il file ZIP deve contenere un solo file di dati da leggere. Impostare su Nessuno per non decomprimere.

Novità nella versione 0.18.1: supporto per la compressione "zip" e "xz".


6
Non c'è supporto per i file zippati, solo gzip e bz2. Questo è irritante, perché zip è piuttosto comune. Immagino che questo sia perché zip non è open source?
— TC Proctor

24
zip è ora supportato in panda 0.18.1
— nishant

1
Questa soluzione funziona per un file compresso con gzip ma non per i file .tar.gz (Pandas 0.19.2) Tar.gz non è supportato da Pandas! Vedi: github.com/pandas-dev/pandas/issues/…
— tector

Potresti dirci se c'è qualche motivo particolare per usarlo quotechar?
— Ingegnere senza herpes

Questa risposta mostra un .tar.gzfile, ma probabilmente funziona solo con un .gzfile.
— William Entriken

41

Penso che tu voglia openlo ZipFile, che restituisce un oggetto simile a un file, piuttosto che 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: puoi analizzare le colonne della data durante la lettura:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
— Andy Hayden

Per leggere il primo file:pd.read_csv(z.open(z.infolist()[0].filename))
— user3226167

15

Sembra che tu non debba nemmeno più specificare la compressione. Il frammento di codice seguente carica i dati da filename.zip in df.

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

(Ovviamente dovrai specificare separatore, intestazione, ecc. Se sono diversi dai valori predefiniti.)


Questa dovrebbe essere la risposta migliore, le altre sono obsolete.
— rjurney

12

Per i file " zip ", puoi usare import zipfilee il tuo codice funzionerà semplicemente con queste righe:

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

E il risultato sarà:

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

Segui questo link.

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)

Benvenuto in Stack Overflow! Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo come commenti con il codice o come paragrafo separato su come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
— Sardar Usama
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.