Pandas read_csv() em Python com exemplo
⚡ Resumo Inteligente
A função `read_csv()` do Pandas transforma um arquivo CSV (valores separados por vírgula), local ou remoto, em um DataFrame em uma única chamada. Este passo a passo importa o conjunto de dados do censo de adultos da UCI, nomeia suas quinze colunas e resume o resultado com agregações `groupby`.

Importar CSV no Pandas
Durante o tutorial do TensorFlow, você usará o conjunto de dados de adultos, que é frequentemente usado para tarefas de classificação. O arquivo usado abaixo é o arquivo bruto. adult.data exportado do Repositório de Aprendizado de Máquina da UCI, e a página do conjunto de dados também oferece um download compactado e o ucimlrepo pacote caso o caminho direto pare de ser resolvido.
Os dados estão armazenados em formato CSV. O conjunto de dados inclui 8 variáveis categóricas:
- classe de trabalho
- educação
- marital
- ocupação
- relacionamento
- raça
- sexo
- país nativo
E 6 variáveis contínuas:
- idade
- fnlwgt
- número_educação
- Ganho de capital
- perda_capital
- horas_semana
Juntamente com a renda label coluna, que são os 15 nomes de coluna que você passará para Pandas na próxima seção.
Método read_csv() do Pandas
Para importar um conjunto de dados CSV, você pode usar o objeto pd.read_csv(). A assinatura básica é:
Sintaxe read_csv() do Pandas
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- caminho_do_arquivo_ou_buffer: caminho, URLou objeto semelhante a um arquivo que contém os dados
- sep=',': o delimitador a ser usado
- nomes=NenhumDê os nomes às colunas. Se o conjunto de dados tiver dez colunas, você precisa passar dez nomes.
- coluna_índice=Nenhuma: qual coluna usar como índice de linha. Passe False para forçar um novo índice inteiro.
- skipinitialspace=False: ignore os espaços após o delimitador
Para a lista completa de argumentos, consulte o documento oficial. Documentação do pandas.read_csv().
Exemplo de read_csv() do Pandas
O trecho de código abaixo nomeia todas as 15 colunas, aponta para o arquivo UCI e remove o espaço que segue cada vírgula neste conjunto de dados específico.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
Saída:
(32561, 15)
O formato confirma 32,561 linhas e 15 colunas, portanto, cada nome em COLUMNS foi associado a um campo no arquivo.
Parâmetros principais da função read_csv() do Pandas
A função `read_csv()` aceita mais de cinquenta argumentos, mas um pequeno grupo abrange quase todas as importações reais. Os valores padrão abaixo são os documentados na referência atual da API do pandas.
| Parâmetro | Padrão | O que ele faz |
| setembro | ',' | Caractere ou expressão regular usada como delimitador. Use sep=';' ou sep='\t' para outros formatos. |
| cabeçalho | 'inferir' | Número da linha que contém os rótulos das colunas. Passe header=None quando o arquivo não tiver uma linha de cabeçalho. |
| nomes | não configurado | Lista explícita de rótulos de coluna. Combine com header=0 para substituir um cabeçalho existente. |
| coluna_índice | nenhum | Coluna a ser usada como índice da linha. `index_col=False` força um índice inteiro simples. |
| usecols | nenhum | Subconjunto de colunas a serem carregadas, por rótulo ou posição. Isso reduz o tempo de análise e o consumo de memória. |
| dtipo | nenhum | Tipos de dados por coluna, por exemplo {'idade': 'int32'}. Ignora a inferência de tipo. |
| na_values | nenhum | Cadeias de caracteres extras que devem ser lidas como NaN, como o marcador '?' no conjunto de dados de adultos. |
| pular linhas / n linhas | nenhum | Ignore as linhas iniciais ou leia apenas as primeiras N linhas de dados. |
| analisar_datas | nenhum | Colunas a serem convertidas para datetime durante a leitura, combinadas com date_format. |
| codificação | 'utf-8' | Codificação de texto do arquivo. Use 'latin-1' ou 'cp1252' para exportações legadas. |
| tamanho do pedaço | nenhum | Retorna um iterador que produz o arquivo em blocos de N linhas. |
| em_linhas_ruins | 'erro' | O que fazer com linhas malformadas: elevá-las, emitir um aviso ou ignorá-las. |
Duas delas merecem destaque. index_col=False Não é o mesmo que deixar sem definir: isso instrui explicitamente o Pandas a não promover a primeira coluna, que é o que você deseja quando um arquivo termina cada linha com um delimitador inesperado. names sobrescreve silenciosamente tudo o que o arquivo declara, então passe header=0 ao lado disso, quando o CSV realmente contém uma linha de cabeçalho.
Método groupby() do Pandas
Uma maneira fácil de visualizar os dados é usar o método groupby. Esse método permite resumir os dados por grupo. Abaixo está uma lista das agregações disponíveis com o método groupby():
- contar: contar
- min: min
- máximo: máximo
- significar: significar
- mediana: mediana
- desvio padrão: std
- e outros
Dentro da função groupby(), você especifica a coluna que deseja usar para agrupar os elementos antes de aplicar a agregação.
Vamos analisar um único grupo.ping Com o conjunto de dados de adultos, você obterá a média de todas as variáveis contínuas por tipo de receita, ou seja, acima de 50 mil ou abaixo de 50 mil.
df_train.groupby(['label']).mean()
| rótulo | idade | fnlwgt | número_educação | Ganho de capital | perda_capital | horas_semana |
| <= 50K | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50K | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Você pode obter a idade mínima por tipo de domicílio:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Você também pode agrupar por múltiplas colunas. Por exemplo, você pode obter o ganho máximo de capital de acordo com o tipo de domicílio e o estado civil.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
Você pode criar um gráfico após um agrupamento (groupby). Uma maneira de fazer isso é plotar o resultado agrupado diretamente.
Para criar um gráfico mais claro, aplique unstack() após mean() para que o estado civil seja movido do índice para as colunas. O gráfico então terá dois grupos, um para cada faixa de renda, em vez das quatorze (2*7) barras que um índice multinível plano produziria.
Se você usar um Jupyter PortátilLembre-se de adicionar `%matplotlib` diretamente no código, caso contrário nenhum gráfico será exibido.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Ao representar esse quadro não empilhado em um gráfico de barras, obtemos a figura abaixo.
Como ler arquivos CSV grandes com Pandas
O conjunto de dados de adultos é pequeno, mas a mesma chamada pode travar em uma exportação de vários gigabytes. Três argumentos fazem a maior parte do trabalho.
- usecols Carrega apenas as colunas realmente necessárias. A documentação do pandas observa que isso resulta em uma análise sintática muito mais rápida e menor uso de memória.
- dtipo Ao associar cada coluna a um tipo específico, o Pandas ignora a inferência e não amplia os inteiros para 64 bits por padrão.
- tamanho do pedaço Retorna um TextFileReader em vez de um DataFrame, permitindo que você percorra blocos de N linhas e agregue os resultados conforme avança.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
Duas outras opções ajudam depois que o básico já estiver estabelecido. engine='pyarrow' muda para o analisador Arrow multithread e dtype_backend='pyarrow' Mantém o resultado em colunas com setas como suporte. low_memory Por padrão, é verdadeiro, o que analisa o arquivo internamente em partes, mas pode produzir tipos mistos em uma coluna; defina um tipo de dados explícito em vez de depender dele.
Finalmente, compression='infer' Significa que um caminho que termina em .gz, .zip, .bz2, .xz ou .zst é descompactado em tempo real, portanto não é necessário descompactar um arquivo antes de lê-lo.
Erros comuns na função read_csv() do Pandas e como corrigi-los
A maioria das falhas em read_csv() tem quatro causas principais, e cada uma delas possui um argumento documentado que a resolve.
| erro | Causar | Fixar |
| Erro FileNotFound | O caminho é relativo ao diretório de trabalho, não ao script. | Use um caminho absoluto ou confirme o URL O esquema pode ser um dos seguintes: http, ftp, s3, gs ou arquivo. |
| UnicodeDecodeError | O arquivo não está em UTF-8, que é a codificação padrão. | Passe encoding='latin-1' ou o codec correto, ou encoding_errors='replace'. |
| ParserError: Erro ao tokenizar os dados | Uma linha contém mais campos do que o cabeçalho declara. | Passe on_bad_lines='skip' ou 'warn', ou defina o sep correto. |
| Aviso de tipo de dados: as colunas têm tipos mistos. | A inferência de tipo em blocos identificou tipos diferentes em uma mesma coluna. | Defina um dtype explícito ou low_memory=False. |
| Colunas deslocadas em uma posição | Um delimitador final faz com que o Pandas promova o primeiro campo ao índice. | Passe index_col=False. |
O conjunto de dados de adultos mostra diretamente o caso de valores ausentes: entradas desconhecidas de classe de trabalho, ocupação e país de origem são armazenadas como um ponto de interrogação literal, portanto, chegam como a string '?' a menos que você as declare.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

