seleccionar - seleccion de columnas en python
Eliminar columnas en un CSV con python (7)
He podido crear un csv con python utilizando la entrada de varios usuarios en este sitio y deseo expresar mi gratitud por sus publicaciones. Ahora estoy perplejo y publicaré mi primera pregunta.
Mi input.csv se ve así:
day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00
Estoy tratando de eliminar la columna "año" y todas sus entradas. En total hay más de 40 entradas con un rango de años desde 1960-2010.
Depende de cómo almacene el CSV analizado, pero generalmente desea el operador del.
Si tienes una serie de dictados:
input = [ {''day'':01, ''month'':04, ''year'':2001, ...}, ... ]
for E in input: del E[''year'']
Si tienes una serie de matrices:
input = [ [01, 04, 2001, ...],
[...],
...
]
for E in input: del E[2]
El uso de un dict para capturar encabezados y luego hacer un bucle le permite obtener lo que necesita de manera limpia.
import csv
ct = 0
cols_i_want = {''cost'' : -1, ''date'' : -1}
with open("file1.csv","rb") as source:
rdr = csv.reader( source )
with open("result","wb") as result:
wtr = csv.writer( result )
for row in rdr:
if ct == 0:
cc = 0
for col in row:
for ciw in cols_i_want:
if col == ciw:
cols_i_want[ciw] = cc
cc += 1
wtr.writerow( (row[cols_i_want[''cost'']], row[cols_i_want[''date'']]) )
ct += 1
El uso del módulo Pandas será mucho más fácil.
import pandas as pd
f=pd.read_csv("test.csv")
keep_col = [''day'',''month'',''lat'',''long'']
new_f = f[keep_col]
new_f.to_csv("newFile.csv", index=False)
Y aquí hay una breve explicación:
>>>f=pd.read_csv("test.csv")
>>> f
day month year lat long
0 1 4 2001 45 120
1 2 4 2003 44 118
>>> keep_col = [''day'',''month'',''lat'',''long'']
>>> f[keep_col]
day month lat long
0 1 4 45 120
1 2 4 44 118
>>>
En la parte superior de mi cabeza, esto lo hará sin ningún tipo de comprobación de errores ni capacidad para configurar nada. Eso es "dejado al lector".
outFile = open( ''newFile'', ''w'' )
for line in open( ''oldFile'' ):
items = line.split( '','' )
outFile.write( '',''.join( items[:2] + items[ 3: ] ) )
outFile.close()
Puede eliminar directamente la columna con sólo
del variable_name[''year'']
puede usar el paquete csv
para iterar sobre su archivo csv y generar las columnas que desee en otro archivo csv.
El siguiente ejemplo no está probado y debería ilustrar una solución:
import csv
file_name = ''C:/Temp/my_file.csv''
output_file = ''C:/Temp/new_file.csv''
csv_file = open(file_name, ''r'')
## note that the index of the year column is excluded
column_indices = [0,1,3,4]
with open(output_file, ''w'') as fh:
reader = csv.reader(csv_file, delimiter='','')
for row in reader:
tmp_row = []
for col_inx in column_indices:
tmp_row.append(row[col_inx])
fh.write('',''.join(tmp_row))
import csv
with open("source","rb") as source:
rdr= csv.reader( source )
with open("result","wb") as result:
wtr= csv.writer( result )
for r in rdr:
wtr.writerow( (r[0], r[1], r[3], r[4]) )
Por cierto, el bucle for
se puede eliminar, pero no se puede simplificar realmente.
in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr )
wtr.writerows( in_iter )
Además, puede pegar de manera hiper-literal a los requisitos para eliminar una columna. Considero que esta es una mala política en general porque no se aplica a la eliminación de más de una columna. Cuando intenta eliminar el segundo, descubre que las posiciones han cambiado y la fila resultante no es obvia. Pero solo por una columna, esto funciona.
del r[2]
wtr.writerow( r )