Estou tentando analisar através de um arquivo csv e extrair os dados de apenas colunas específicas.
Exemplo csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Eu estou tentando capturar apenas colunas específicas, dizem ID
, Name
, Zip
e Phone
.
O código que eu observei me levou a acreditar que posso chamar a coluna específica pelo seu número correspondente, ou seja: Name
corresponderia 2
e iteraria através de cada linha usando row[2]
produziria todos os itens da coluna 2. Só que não.
Aqui está o que eu fiz até agora:
import sys, argparse, csv
from settings import *
# command arguments
parser = argparse.ArgumentParser(description='csv to postgres',\
fromfile_prefix_chars="@" )
parser.add_argument('file', help='csv file to import', action='store')
args = parser.parse_args()
csv_file = args.file
# open csv file
with open(csv_file, 'rb') as csvfile:
# get number of columns
for line in csvfile.readlines():
array = line.split(',')
first_item = array[0]
num_columns = len(array)
csvfile.seek(0)
reader = csv.reader(csvfile, delimiter=' ')
included_cols = [1, 2, 6, 7]
for row in reader:
content = list(row[i] for i in included_cols)
print content
e espero que isso imprima apenas as colunas específicas que quero para cada linha, exceto que não, recebo apenas a última coluna.
'rb'
sinalizar paraopen()
? não deveria ser simplesr
?"rb"
é apropriado para a passagemcsv.reader
.Respostas:
A única maneira de obter a última coluna desse código é se você não incluir sua declaração de impressão em seu
for
loop.Provavelmente, este é o fim do seu código:
Você quer que seja assim:
Agora que cobrimos seu erro, gostaria de apresentar esse módulo ao pandas .
O Pandas é espetacular para lidar com arquivos csv, e o código a seguir seria tudo o que você precisa para ler um csv e salvar uma coluna inteira em uma variável:
portanto, se você deseja salvar todas as informações da sua coluna
Names
em uma variável, é tudo o que você precisa fazer:É um ótimo módulo e sugiro que você o analise. Se, por algum motivo, sua declaração de impressão estava em
for
loop e ainda estava imprimindo apenas a última coluna, o que não deveria acontecer, mas deixe-me saber se minha suposição estava errada. Seu código postado possui muitos erros de recuo, portanto, era difícil saber o que deveria estar onde. Espero que isso tenha sido útil!fonte
Com um arquivo como
Saída
Ou, como alternativa, se você deseja indexação numérica para as colunas:
Para alterar o deliminador, adicione
delimiter=" "
à instanciação apropriada, ou seja,reader = csv.reader(f,delimiter=" ")
fonte
Use pandas :
Descartar colunas desnecessárias no momento da análise:
PS: Estou apenas agregando o que os outros disseram de uma maneira simples. As respostas reais são obtidas aqui e aqui .
fonte
Com os pandas você pode usar
read_csv
com ousecols
parâmetro:Exemplo:
fonte
Você pode usar
numpy.loadtext(filename)
. Por exemplo, se este é seu banco de dados.csv
:E você quer a
Name
coluna:Mais facilmente você pode usar
genfromtext
:fonte
Contexto: Para esse tipo de trabalho, você deve usar a incrível biblioteca python petl. Isso poupará muito trabalho e potencial frustração de fazer as coisas 'manualmente' com o módulo csv padrão. AFAIK, as únicas pessoas que ainda usam o módulo csv são aquelas que ainda não descobriram ferramentas melhores para trabalhar com dados tabulares (pandas, petl etc.), o que é bom, mas se você planeja trabalhar com muitos dados em sua carreira de várias fontes estranhas, aprender algo como petl é um dos melhores investimentos que você pode fazer. Para começar, demore apenas 30 minutos depois de concluir o pip install petl. A documentação é excelente.
Resposta: Digamos que você tenha a primeira tabela em um arquivo csv (você também pode carregar diretamente do banco de dados usando petl). Então você simplesmente carregaria e faria o seguinte.
fonte
Eu acho que existe uma maneira mais fácil
Então aqui
iloc[:, 0]
,:
significa todos os valores,0
significa a posição da coluna. no exemplo abaixoID
será selecionadofonte
fonte
pip install pandas
primeiroGraças à maneira como você pode indexar e agrupar um dataframe do pandas, uma maneira muito fácil de extrair uma única coluna de um arquivo csv para uma variável é:
Algumas coisas a considerar:
O trecho acima produzirá pandas
Series
e nãodataframe
. A sugestão de ayhan withusecols
também será mais rápida se a velocidade for um problema. Testar as duas abordagens diferentes usando%timeit
um arquivo CSV de 2122 KB de tamanho gera22.8 ms
a abordagem usecols e53 ms
a minha abordagem sugerida.E não esqueça
import pandas as pd
fonte
Se você precisar processar as colunas separadamente, eu gostaria de desestruturar as colunas com o
zip(*iterable)
padrão (efetivamente "descompacte"). Então, para o seu exemplo:fonte
Para buscar o nome da coluna , em vez de usar readlines (), use readline () para evitar loop e ler o arquivo completo e armazená-lo na matriz.
fonte