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?

pengguna2793667
sumber

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

Begitulah
sumber
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)
Andy Hayden
sumber
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.)

TDS
sumber
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...
imanzabet
sumber
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)
Suryakanta Karan
sumber
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