Estoy tratando de analizar un archivo csv y extraer los datos solo de columnas específicas.
Ejemplo csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Estoy tratando de capturar solamente las columnas específicas, por ejemplo ID
, Name
, Zip
y Phone
.
El código que he visto me ha llevado a creer que puedo llamar a la columna específica por su número correspondiente, por ejemplo: Name
correspondería 2
e iterar a través de cada fila usando row[2]
produciría todos los elementos en la columna 2. Solo que no.
Esto es lo que he hecho hasta ahora:
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
y espero que esto imprima solo las columnas específicas que quiero para cada fila, excepto que no, solo obtengo la última columna.
'rb'
marcaropen()
? ¿No debería ser simpler
?"rb"
es apropiado para pasar acsv.reader
.Respuestas:
La única forma en que obtendría la última columna de este código es si no incluye su declaración de impresión en su
for
bucle.Este es probablemente el final de su código:
Quieres que sea esto:
Ahora que hemos cubierto su error, me gustaría aprovechar este tiempo para presentarle el módulo de pandas .
Pandas es espectacular para tratar con archivos csv, y el siguiente código sería todo lo que necesita para leer un csv y guardar una columna completa en una variable:
así que si desea guardar toda la información en su columna
Names
en una variable, esto es todo lo que necesita hacer:Es un gran módulo y le sugiero que lo investigue. Si por alguna razón su declaración de impresión estaba en
for
bucle y todavía solo imprimía la última columna, lo que no debería suceder, pero avíseme si mi suposición fue incorrecta. Su código publicado tiene muchos errores de sangría, por lo que era difícil saber qué se suponía que debía estar dónde. ¡Espero que esto haya sido útil!fuente
Con un archivo como
Saldrá
O, alternativamente, si desea indexación numérica para las columnas:
Para cambiar el deliminador agregue
delimiter=" "
a la instanciación apropiada, es decirreader = csv.reader(f,delimiter=" ")
fuente
Usa pandas :
Deseche las columnas innecesarias en el momento del análisis:
PD: Solo estoy agregando lo que otros han dicho de una manera simple. Las respuestas reales se toman de aquí y de aquí .
fuente
Con pandas puedes usar
read_csv
con elusecols
parámetro:Ejemplo:
fuente
Puedes usar
numpy.loadtext(filename)
. Por ejemplo, si esta es su base de datos.csv
:Y quieres la
Name
columna:Más fácilmente puedes usar
genfromtext
:fuente
Contexto: para este tipo de trabajo, debe utilizar la increíble biblioteca python petl. Eso le ahorrará mucho trabajo y la posible frustración de hacer las cosas 'manualmente' con el módulo csv estándar. AFAIK, las únicas personas que todavía usan el módulo csv son aquellas que aún no han descubierto mejores herramientas para trabajar con datos tabulares (pandas, petl, etc.), lo cual está bien, pero si planea trabajar con muchos datos en su carrera de varias fuentes extrañas, aprender algo como petl es una de las mejores inversiones que puede hacer. Para comenzar, solo debe tomar 30 minutos después de haber realizado pip install petl. La documentación es excelente.
Respuesta: Digamos que tiene la primera tabla en un archivo csv (también puede cargar directamente desde la base de datos usando petl). Entonces simplemente lo cargaría y haría lo siguiente.
fuente
Creo que hay una manera más fácil
Entonces aquí
iloc[:, 0]
,:
significa todos los valores,0
significa la posición de la columna. en el siguiente ejemploID
será seleccionadofuente
fuente
pip install pandas
Primero tendrás que hacerloGracias a la forma en que puede indexar y subconjugar un marco de datos de pandas, una forma muy fácil de extraer una sola columna de un archivo csv en una variable es:
Algunas cosas a considerar:
El fragmento de arriba producirá un pandas
Series
y nodataframe
. La sugerencia de ayhan conusecols
también será más rápida si la velocidad es un problema. Probar los dos enfoques diferentes usando%timeit
un archivo csv de 2122 KB de tamaño produce22.8 ms
el enfoque de usecols y53 ms
mi enfoque sugerido.Y no te olvides
import pandas as pd
fuente
Si necesita procesar las columnas por separado, me gusta desestructurar las columnas con el
zip(*iterable)
patrón (efectivamente "descomprimir"). Entonces, para su ejemplo:fuente
Para buscar el nombre de la columna , en lugar de usar readlines () mejor use readline () para evitar bucles y leer el archivo completo y almacenarlo en la matriz.
fuente