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?

user2793667
fonte

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

Suchit
fonte
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)
Andy Hayden
fonte
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.)

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