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.