读取压缩文件作为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能够获取文件,但在错误末尾出现“不存在”。

有人可以告诉我我做错了什么吗?

Answers:


159

如果要将压缩文件或tar.gz文件读入pandas数据帧,则这些read_csv方法包括此特定实现。

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

或长格式:

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

docs中压缩参数的说明:

压缩:{'infer','gzip','bz2','zip','xz',无},默认为'infer'用于对磁盘数据进行实时解压缩。如果'infer'和filepath_or_buffer与路径类似,则从以下扩展名检测压缩:'.gz','。bz2','。zip'或'.xz'(否则不进行解压缩)。如果使用“ zip”,则ZIP文件必须仅包含一个要读取的数据文件。设置为“无”将不进行解压缩。

0.18.1版中的新功能:支持“ zip”和“ xz”压缩。


6
不支持压缩文件,仅支持gzip和bz2。这很烦人,因为zip非常普遍。我想这是因为zip不是开源的吗?
TC Proctor

24
熊猫0.18.1现在支持zip
nishant'x

1
此解决方案适用于gzip压缩文件,但不适用于.tar.gz文件(Pandas 0.19.2)。Pandas不支持Tar.gz!请参阅:github.com/pandas-dev/pandas/issues/...
tector

您能否告诉我们是否有任何特定的使用理由quotechar
疱疹免费工程师

此答案显示了一个.tar.gz文件,但它可能仅适用于.gz文件。
William Entriken '18

41

我认为您想要openZipFile,它返回一个类似文件的对象,而不是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'])
Andy Hayden 2013年

要读取第一个文件:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167'9

15

似乎您甚至不必再指定压缩。以下代码段将文件名中的数据加载到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!尽管此代码可以回答问题,但提供额外的上下文(作为对代码的注释)或作为有关如何和/或为什么解决问题的单独段落,将提高答案的长期价值。
萨达尔·乌萨玛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.