Leia um arquivo compactado como um DataFrame do pandas


108

Estou tentando descompactar um arquivo csv e passá-lo para o pandas para que eu possa trabalhar no arquivo.
O código que tentei até agora é:

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

Após a última linha, embora o python seja capaz de obter o arquivo, recebo um "não existe" no final do erro.

Alguém pode me dizer o que estou fazendo de forma incorreta?

Respostas:


159

Se você quiser ler um arquivo compactado ou tar.gz no dataframe do pandas, os read_csvmétodos incluem esta implementação específica.

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

Ou a forma longa:

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

Descrição do argumento de compressão dos documentos :

compressão : {'inferir', 'gzip', 'bz2', 'zip', 'xz', Nenhum}, padrão 'inferir' Para descompressão instantânea de dados no disco. Se 'inferir' e filepath_or_buffer for semelhante a um caminho, detecte a compactação das seguintes extensões: '.gz', '.bz2', '.zip' ou '.xz' (caso contrário, sem descompressão). Se estiver usando 'zip', o arquivo ZIP deve conter apenas um arquivo de dados para ser lido. Defina como Nenhum para não descompactar.

Novo na versão 0.18.1: suporte para compressão 'zip' e 'xz'.


6
Não há suporte para arquivos compactados, apenas gzip e bz2. Isso é irritante, porque o zip é bastante comum. Eu imagino que isso seja porque zip não é open source?
— TC Proctor de

24
zip agora é compatível com o pandas 0.18.1
— nishant

1
Esta solução funciona para um arquivo gzipado, mas não para arquivos .tar.gz (Pandas 0.19.2) Tar.gz não é suportado pelo Pandas! Veja: github.com/pandas-dev/pandas/issues/…
— tector

Você poderia nos dizer se há algum motivo específico para o uso quotechar?
— Herpes Free Engineer

Esta resposta mostra um .tar.gzarquivo, mas provavelmente só funciona com um .gzarquivo.
— William Entriken,

41

Acho que você quer openo ZipFile, que retorna um objeto semelhante a um arquivo, em vez de 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
Observação: você pode analisar as colunas de data ao ler:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
— Andy Hayden,

Para ler o primeiro arquivo:pd.read_csv(z.open(z.infolist()[0].filename))
— user3226167

15

Parece que você não precisa mais especificar a compressão. O trecho a seguir carrega os dados de filename.zip em df.

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

(Claro, você precisará especificar o separador, o cabeçalho, etc. se eles forem diferentes dos padrões.)


Esta deve ser a resposta principal, as outras estão desatualizadas.
— rjurney

12

Para arquivos " zip ", você pode usar import zipfilee seu código funcionará simplesmente com estas linhas:

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

E o resultado será:

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

Por favor, siga este link.

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)

Bem-vindo ao Stack Overflow! Embora este código possa responder à pergunta, fornecer contexto adicional como comentários com o código ou como um parágrafo separado sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo.
— Sardar Usama
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.