una seleccionar seleccion panda matriz filas eliminar como columnas columna borrar python csv row-removal

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 )