在带有pandas和chunk的python中,有没有更快地读取文件的方法?

2024-04-29 08:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3和pandas中,我有一个脚本来读取9.8gb的CSV文件

我使用块并在“cnae\u财政”列中搜索感兴趣的代码

然后结果创建一个新的数据帧。我这么做了:

import pandas as pd
import numpy as np

# Establish chunks in the file and reduce the number of columns that will be used
# Two columns with identifier codes need to transform into str
# And other routines to handle the file

TextFileReader = pd.read_csv('dados/empresa.csv',\
                             chunksize=1000,\
                             sep=',',\
                             names=['indicador_full_diario',
                                    'tipo_de_atualizacao',
                                    'cnpj',
                                    'identificador_matrizfilial',
                                    'razao_socialnome_empresarial',
                                    'nome_fantasia',
                                    'situacao_cadastral',
                                    'data_situacao_cadastral', 
                                    'motivo_situacao_cadastral', 
                                    'nm_cidade_exterior', 
                                    'co_pais', 
                                    'nm_pais', 
                                    'codigo_natureza_juridica', 
                                    'data_inicio_atividade', 
                                    'cnae_fiscal', 
                                    'descricao_tipo_logradouro', 
                                    'logradouro', 
                                    'numero', 
                                    'complemento', 
                                    'bairro', 
                                    'cep', 
                                    'uf', 
                                    'codigo_municipio', 
                                    'municipio', 
                                    'ddd_telefone_1', 
                                    'ddd_telefone_2',
                                    'ddd_fax',
                                    'correio_eletronico',
                                    'qualificacao_do_responsavel',
                                    'capital_social_da_empresa',
                                    'porte_empresa',
                                    'opcao_pelo_simples',
                                    'data_opcao_pelo_simples',
                                    'data_exclusao_do_simples',
                                    'opcao_pelo_mei',
                                    'situacao_especial',
                                    'data_situacao_especial'],\
                             header=None,\
                             converters={'cnpj': lambda x: str(x),
                                         'cnae_fiscal': lambda x: str(x)},\
                             usecols=['cnpj',
                                      'identificador_matrizfilial',
                                      'razao_socialnome_empresarial',
                                      'nome_fantasia', 
                                      'situacao_cadastral',
                                      'nm_cidade_exterior',
                                      'nm_pais',
                                      'codigo_natureza_juridica',
                                      'data_inicio_atividade',
                                      'cnae_fiscal',
                                      'descricao_tipo_logradouro',
                                      'logradouro',
                                      'numero',
                                      'complemento',
                                      'bairro',
                                      'cep',
                                      'uf',
                                      'municipio',
                                      'qualificacao_do_responsavel',
                                      'capital_social_da_empresa',
                                      'porte_empresa',
                                      'situacao_especial'],\
                            decimal=',') 

dfList = [] # Create empty list

# Set a counter, if 0 does an assignment of found values, greater than zero does an append
conta = 0

# Iteration in each chunk
for df in TextFileReader:
    dfList.append(df)
    df_parcial = pd.concat(dfList, sort=False)

    # Search by codes of interest 
    nome = df_parcial[((df_parcial['cnae_fiscal'] == '2121101') |
                      (df_parcial['cnae_fiscal'] == '4771701') |
                      (df_parcial['cnae_fiscal'] == '2121103') |
                      (df_parcial['cnae_fiscal'] == '4644301') |
                      (df_parcial['cnae_fiscal'] == '2110600') |
                      (df_parcial['cnae_fiscal'] == '2121102')) &
                      (df_parcial['situacao_cadastral'] == 2)
                     ]

    # Checks if found
    if nome.empty is False:
        if conta == 0:
            df_final = nome
        else:
            df_final = df_final.append(nome)

        conta = conta + 1

    dfList = []
    df = ''

df_final.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 120154 entries, 9101 to 40183445
Data columns (total 22 columns):
cnpj                            120154 non-null object
identificador_matrizfilial      120154 non-null int64
razao_socialnome_empresarial    120154 non-null object
nome_fantasia                   90585 non-null object
situacao_cadastral              120154 non-null int64
nm_cidade_exterior              39 non-null object
nm_pais                         203 non-null object
codigo_natureza_juridica        120154 non-null int64
data_inicio_atividade           120154 non-null object
cnae_fiscal                     120154 non-null object
descricao_tipo_logradouro       119251 non-null object
logradouro                      120152 non-null object
numero                          119979 non-null object
complemento                     49883 non-null object
bairro                          119759 non-null object
cep                             119951 non-null float64
uf                              120154 non-null object
municipio                       120154 non-null object
qualificacao_do_responsavel     120154 non-null int64
capital_social_da_empresa       120154 non-null int64
porte_empresa                   120154 non-null int64
situacao_especial               63 non-null object
dtypes: float64(1), int64(6), object(15)
memory usage: 21.1+ MB

我在Mac(2.2GHz Intel Core i7)上做了这个,内存为16GB

花了大约50分钟

请问,有没有代码技术让这个过程更快?你知道吗

还是拥有一台速度更快、内存更大的电脑?你知道吗


Tags: dfdataobjectnullfiscalnonnmnome