Lire un fichier zippé en tant que DataFrame pandas

108

J'essaie de décompresser un fichier csv et de le transmettre aux pandas afin que je puisse travailler sur le fichier.
Le code que j'ai essayé jusqu'à présent est:

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

Après la dernière ligne, bien que python soit capable d'obtenir le fichier, j'obtiens un "n'existe pas" à la fin de l'erreur.

Quelqu'un peut-il me dire ce que je fais de manière incorrecte?

utilisateur2793667
la source

Réponses:

159

Si vous souhaitez lire un fichier compressé ou tar.gz dans le dataframe pandas, les read_csvméthodes incluent cette implémentation particulière.

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

Ou la forme longue:

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

Description de l'argument de compression dans la documentation :

compression : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, par défaut 'infer' Pour la décompression à la volée des données sur disque. Si 'infer' et filepath_or_buffer est semblable à un chemin, alors détectez la compression à partir des extensions suivantes: '.gz', '.bz2', '.zip' ou '.xz' (sinon pas de décompression). Si vous utilisez 'zip', le fichier ZIP ne doit contenir qu'un seul fichier de données à lire. Réglez sur Aucun pour aucune décompression.

Nouveau dans la version 0.18.1: prise en charge de la compression 'zip' et 'xz'.

Suchit
la source
6
Il n'y a pas de support pour les fichiers compressés, seulement gzip et bz2. C'est irritant, car le zip est assez courant. J'imagine que c'est parce que zip n'est pas open source?
TC Proctor
24
zip est maintenant pris en charge dans pandas 0.18.1
nishant
1
Cette solution fonctionne pour un fichier gzippé mais pas pour les fichiers .tar.gz (Pandas 0.19.2) Tar.gz n'est pas pris en charge par Pandas! Voir: github.com/pandas-dev/pandas/issues/...
Tector
Pouvez-vous nous dire s'il y a une raison particulière d'utiliser quotechar?
Herpes Free Engineer
Cette réponse montre un .tar.gzfichier, mais cela ne fonctionne probablement qu'avec un .gzfichier.
William Entriken
41

Je pense que vous voulez openle ZipFile, qui renvoie un objet semblable à un fichier, plutôt que 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
la source
3
Remarque: vous pouvez analyser les colonnes de date lors de la lecture:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Andy Hayden
Pour lire le premier fichier:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167
15

Il semble que vous n'ayez même plus besoin de spécifier la compression. L'extrait de code suivant charge les données de filename.zip dans df.

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

(Bien sûr, vous devrez spécifier un séparateur, un en-tête, etc. s'ils sont différents des valeurs par défaut.)

TDS
la source
Cela devrait être la meilleure réponse, les autres sont obsolètes.
rjurney
12

Pour les fichiers " zip ", vous pouvez utiliser import zipfileet votre code fonctionnera simplement avec ces lignes:

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

Et le résultat sera:

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
la source
0

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

Veuillez suivre ce lien.

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
la source
Bienvenue dans Stack Overflow! Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire soit sous forme de commentaires avec le code, soit sous forme de paragraphe séparé indiquant comment et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse.
Sardar Usama le