zipファイルをpandas DataFrameとして読み取る


108

私はcsvファイルを解凍してパンダに渡そうとしていますので、ファイルで作業できます。
これまでに試したコードは次のとおりです。

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

最終行の後、Pythonはファイルを取得できますが、エラーの最後に「存在しない」というメッセージが表示されます。

誰かが私が間違っていることを教えてもらえますか?

回答:


159

zipファイルまたはtar.gzファイルをpandasデータフレームに読み込む場合、read_csvメソッドにはこの特定の実装が含まれます。

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

または長い形式:

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

ドキュメントからの圧縮引数の説明:

圧縮:{'infer'、 'gzip'、 'bz2'、 'zip'、 'xz'、None}、デフォルト 'infer'オンディスクデータのオンザフライ解凍用。'infer'およびfilepath_or_bufferがパスに似ている場合は、 '。gz'、 '。bz2'、 '。zip'、または '.xz'(それ以外の場合は解凍しない)の拡張子から圧縮を検出します。「zip」を使用する場合、ZIPファイルには読み込むデータファイルを1つだけ含める必要があります。解凍しない場合は、なしに設定します。

バージョン0.18.1の新機能:「zip」および「xz」圧縮のサポート。


6
zipファイルのサポートはありません。gzipとbz2のみです。zipはかなり一般的であるため、これは不愉快です。これはzipがオープンソースではないためだと思いますか?
TCプロクター

24
zipがパンダ0.18.1でサポートされるようになりました
nishant

1
このソリューションはgzip圧縮されたファイルでは機能しますが、.tar.gzファイルでは機能しません(Pandas 0.19.2)Tar.gzはPandasでサポートされていません。参照:github.com/pandas-dev/pandas/issues/...
tector

使用する特別な理由があるかどうか教えてくださいquotechar
ヘルペスフリーエンジニア

この回答は.tar.gzファイルを示していますが、おそらくファイルでのみ機能し.gzます。
William Entriken

41

私はあなたopenがファイルではなくオブジェクトのようなオブジェクトを返すZipFile を望んでいると思います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
注意:あなたが読んで日付列を解析することができますpd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
アンディ・ヘイデン

最初のファイルを読み取るには:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

圧縮を指定する必要はもうないようです。次のスニペットは、filename.zipからdfにデータをロードします。

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

(もちろん、デフォルトと異なる場合は、セパレーター、ヘッダーなどを指定する必要があります。)


これは最高の答えになるはずです、他は時代遅れです。
rjurney

12

zip」ファイルの場合、使用できimport zipfile、コードは次の行で簡単に機能します。

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

そして結果は次のようになります:

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

このリンクに従ってください。

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へようこそ!このコードは質問に答えることがありますが、コードのコメントとして、または問題を解決する方法や理由に関する別の段落として追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Sardar Usama
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.