Sıkıştırılmış bir dosyayı Pandas DataFrame olarak okuyun


108

Dosya üzerinde çalışabilmek için bir csv dosyasını açıp pandalara aktarmaya çalışıyorum.
Şimdiye kadar denediğim kod:

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

Son satırdan sonra python dosyayı alabilse de hatanın sonunda "yok" mesajı alıyorum.

Biri bana ne yaptığımı yanlış söyleyebilir mi?

Yanıtlar:


159

Sıkıştırılmış veya tar.gz dosyasını pandas veri çerçevesine okumak istiyorsanız, read_csvyöntemler bu özel uygulamayı içerir.

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

Veya uzun biçim:

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

Dokümanlardan sıkıştırma argümanının açıklaması :

sıkıştırma : {'çıkarım', 'gzip', 'bz2', 'zip', 'xz', Yok}, varsayılan 'çıkarım' Disk üzerindeki verilerin anında açılıp kapanması için. 'Çıkarım' ve dosya yolu_veya_buffer yol benzeri ise, şu uzantılardan sıkıştırmayı algılayın: '.gz', '.bz2', '.zip' veya '.xz' (aksi takdirde açma yok). 'Zip' kullanılıyorsa, ZIP dosyasının okunması için yalnızca bir veri dosyası içermesi gerekir. Açılmaması için Yok olarak ayarlayın.

0.18.1 sürümündeki yenilik: 'zip' ve 'xz' sıkıştırması desteği.


6
Sıkıştırılmış dosyalar için destek yoktur, sadece gzip ve bz2. Bu rahatsız edici çünkü zip oldukça yaygındır. Bunun zip açık kaynak olmadığı için olduğunu düşünüyorum.
— TC Proctor

24
zip artık 0.18.1 pandalarda destekleniyor
— nishant

1
Bu çözümler gzip'lenmiş bir dosya için işe yarar, ancak .tar.gz dosyaları için geçerli değildir (Pandalar 0.19.2) Tar.gz, Pandalar tarafından desteklenmez! Bkz: github.com/pandas-dev/pandas/issues/...
— Tector

Lütfen bize kullanmak için özel bir neden olup olmadığını söyler misiniz quotechar?
— Herpes Free Engineer

Bu cevap bir .tar.gzdosyayı gösterir , ancak muhtemelen sadece bir .gzdosya ile çalışır .
— William Entriken

41

openAşağıdakilerden ziyade dosya benzeri bir nesne döndüren ZipFile'ı istediğinizi düşünüyorum 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
Not: Tarih sütunlarını aşağıdakileri okurken ayrıştırabilirsiniz:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
— Andy Hayden

İlk dosyayı okumak için:pd.read_csv(z.open(z.infolist()[0].filename))
— user3226167

15

Görünüşe göre artık sıkıştırmayı belirlemenize gerek yok. Aşağıdaki kod parçası, verileri dosyaadı.zip dosyasından df'ye yükler.

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

(Varsayılanlardan farklılarsa, elbette ayırıcı, başlık vb. Belirtmeniz gerekecektir.)


Bu en iyi cevap olmalı, diğerleri modası geçmiş.
— rjurney

12

" Zip " dosyaları için kullanabilirsiniz import zipfileve kodunuz basitçe şu satırlarla çalışacaktır:

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

Ve sonuç şöyle olacak:

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

Lütfen bu bağlantıyı takip edin.

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)

Stack Overflow'a hoş geldiniz! Bu kod soruyu yanıtlayabilirken, kodla birlikte yorumlar olarak veya sorunun nasıl ve / veya neden çözüldüğüne ilişkin ayrı bir paragraf olarak ek bağlam sağlamak, yanıtın uzun vadeli değerini artıracaktır.
— Sardar Usama
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.