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

  • 🔘 Uma chamada: A função `pd.read_csv()` aceita um caminho de arquivo, um URLou qualquer objeto que exponha um método de leitura.
  • ☑️ Controle de coluna: Passe nomes para rotular as colunas e `index_col=False` para manter um índice inteiro simples.
  • ✅ Espaço em branco: skipinitialspace=True remove o espaço que segue cada vírgula no conjunto de dados de adultos.
  • 🧪 Agrupar e agregar: groupby() resume o quadro com contagem, mínimo, máximo, média, mediana ou desvio padrão.
  • 🛠️ Arquivos grandes: Os parâmetros usecols, dtype e chunksize reduzem o tempo de análise e o consumo de memória em exportações de vários gigabytes.
  • ⚠️ Erros comuns: Codificação, linhas defeituosas e tipos de dados mistos possuem argumentos documentados para corrigi-los.

Pandas read_csv() com exemplo

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.

Gráfico de barras agrupadas da média de ganhos de capital por faixa de renda e estado civil.

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)

Perguntas Frequentes

Ambas as funções chamam o mesmo analisador sintático. A função `read_csv()` usa vírgula como delimitador padrão, enquanto a função `read_table()` lê um arquivo delimitado genérico e espera que você defina o separador (`sep`) manualmente. Use `read_csv()` para arquivos separados por vírgula e `read_table()` para exportações separadas por tabulação ou barra vertical.

Chame df.to_csv('output.csv', index=False). Dropping O índice evita uma primeira coluna sem nome na próxima leitura. Adicione argumentos de separação (sep), codificação (encoding) ou compressão (compression) para refletir as configurações usadas na importação do arquivo.

Passe `parse_dates` com os nomes ou posições das colunas e adicione `date_format` quando o formato não for ISO 8601, por exemplo, `date_format='%d/%m/%Y'`. Sem isso, as colunas de data chegam como strings de objeto simples e precisam de uma chamada separada para `to_datetime`.

Defina `sep` para o caractere, como `sep=';'` ou `sep='\t'`. Separadores com mais de um caractere são tratados como expressões regulares e forçam o uso do método mais lento. Python engine.sep=None permite que o mecanismo detecte o delimitador da primeira linha válida.

Use `nrows` para limitar o número de linhas de dados retornadas e `skiprows` para pular um bloco de linhas iniciais. Combinando-os, você pode percorrer páginas de um arquivo, por exemplo, `skiprows=1000000` com `nrows=999999` para ler o segundo milhão de linhas.

Sim. A compressão padrão é 'inferir', portanto, um caminho que termina em .gz, .zip, .bz2, .xz ou .zst é descompactado automaticamente. URLO uso de http, ftp, s3, gs ou arquivo funciona, e o storage_options passa as credenciais para o backend remoto.

Os modelos treinados sinalizam possíveis erros de digitação, agrupam grafias de categorias quase duplicadas e imputam valores ausentes das colunas adjacentes. Isso restringe a limpeza manual às linhas que uma configuração de na_values ​​ou dtype baseada em regras não consegue resolver sozinha.

O Copilot gera o código padrão rapidamente assim que vê uma amostra do arquivo. Considere a lista de argumentos como um rascunho, pois ela frequentemente tenta adivinhar o tipo de dados e a codificação. Verifique cada palavra-chave gerada em relação à referência da API do pandas antes de executá-la.

Resuma esta postagem com: