Baca file zip sebagai DataFrame pandas


108

Saya mencoba mengekstrak file csv dan menyebarkannya ke panda sehingga saya dapat mengerjakan file tersebut.
Kode yang saya coba sejauh ini adalah:

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

Setelah baris terakhir, meskipun python bisa mendapatkan file tersebut, saya mendapatkan "tidak ada" di akhir kesalahan.

Dapatkah seseorang memberi tahu saya apa yang saya lakukan dengan tidak benar?

Jawaban:


159

Jika Anda ingin membaca file zip atau tar.gz ke dalam pandas dataframe, read_csvmetode ini menyertakan implementasi khusus ini.

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

Atau bentuk panjangnya:

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

Deskripsi argumen kompresi dari dokumen :

kompresi : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, default 'infer' Untuk dekompresi on-the-fly data dalam disk. Jika 'infer' dan filepath_or_buffer mirip dengan jalur, deteksi kompresi dari ekstensi berikut: '.gz', '.bz2', '.zip', atau '.xz' (jika tidak, tanpa dekompresi). Jika menggunakan 'zip', file ZIP hanya boleh berisi satu file data untuk dibaca. Setel ke None untuk tanpa dekompresi.

Baru di versi 0.18.1: dukungan untuk kompresi 'zip' dan 'xz'.


6
Tidak ada dukungan untuk file zip, hanya gzip dan bz2. Ini menjengkelkan, karena zip sangat umum. Saya membayangkan ini karena zip bukan open source?
TC Proctor

24
zip sekarang didukung di pandas 0.18.1
nishant

1
Solusi ini berfungsi untuk file gzip tetapi tidak untuk file .tar.gz (Pandas 0.19.2) Tar.gz tidak didukung oleh Pandas! Lihat: github.com/pandas-dev/pandas/issues/…
tector

Bisakah Anda memberi tahu kami apakah ada alasan khusus untuk menggunakan quotechar?
Insinyur Bebas Herpes

Jawaban ini menunjukkan .tar.gzfile, tetapi mungkin hanya berfungsi dengan .gzfile.
William Entriken

41

Saya pikir Anda ingin openZipFile, yang mengembalikan objek seperti file, daripada 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
Catatan: Anda dapat mengurai kolom tanggal saat membaca:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Andy Hayden

Untuk membaca file pertama:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

Sepertinya Anda bahkan tidak perlu menentukan kompresi lagi. Potongan berikut memuat data dari filename.zip ke df.

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

(Tentu saja Anda perlu menentukan pemisah, tajuk, dll. Jika berbeda dari default.)


Ini harus menjadi jawaban teratas, yang lain sudah ketinggalan zaman.
rjurney

12

Untuk file " zip ", Anda dapat menggunakan import zipfiledan kode Anda akan berfungsi hanya dengan baris berikut:

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

Dan hasilnya adalah:

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

Silakan ikuti tautan ini.

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)

Selamat datang di Stack Overflow! Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan baik sebagai komentar dengan kode atau sebagai paragraf terpisah mengenai bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
Sardar Usama
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.