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.