python - tablas - seleccionar columnas en pandas
Python-reordenar columnas en un csv (5)
El módulo csv
permite leer archivos csv con sus valores asociados a sus nombres de columna. Esto a su vez le permite reorganizar las columnas arbitrariamente, sin tener que permutar explícitamente las listas.
for row in csv.DictReader(open("foo.csv")):
print row["b"], row["a"]
2 1
22 21
Dado el archivo foo.csv :
a,b,d,e,f
1,2,3,4,5
21,22,23,24,25
Tengo un montón de archivos csv con las mismas columnas pero en diferente orden. Estamos intentando cargarlos con SQL * Plus, pero necesitamos las columnas con una configuración de columna fija.
Ejemplo
orden requerida: ABCDEF
Archivo csv: ACDEB (a veces una columna no está en el csv porque no está disponible)
¿Se puede lograr con python? estamos usando Access + Macros para hacerlo ... pero lleva demasiado tiempo
PD. Lo siento si alguien se enoja por mis habilidades en inglés.
Por lo tanto, una forma de abordar este problema es usar la biblioteca de pandas
, que se puede instalar fácilmente usando pip
Básicamente, puede descargar el archivo csv
en el marco de datos pandas y luego reordenar la columna y guardarla nuevamente en el archivo csv
. Por ejemplo, si su sample.csv
ve a continuación:
A,C,B,E,D
a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
Aquí hay un fragmento para resolver el problema.
import pandas as pd
df = pd.read_csv(''/path/to/sample.csv'')
df_reorder = df[[''A'', ''B'', ''C'', ''D'', ''E'']] # rearrange column here
df_reorder.to_csv(''/path/to/sample_reorder.csv'', index=False)
Puede usar el módulo csv para leer, reordenar y luego escribir su archivo.
Archivo de muestra:
$ cat file.csv
A,B,C,D,E
a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
Código
import csv
with open(''file.csv'', ''r'') as infile, open(''reordered.csv'', ''a'') as outfile:
# output dict needs a list for new column ordering
fieldnames = [''A'', ''C'', ''D'', ''E'', ''B'']
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
# reorder the header first
writer.writeheader()
for row in csv.DictReader(infile):
# writes the reordered rows to the new file
writer.writerow(row)
salida
$ cat reordered.csv
A,C,D,E,B
a1,c1,d1,e1,b1
a2,c2,d2,e2,b2
Puedes usar algo similar a this para cambiar el orden, reemplazando '';'' con '','' en tu caso. Como dijo que necesitaba hacer varios archivos .csv, podría usar el módulo glob para obtener una lista de sus archivos.
for file_name in glob.glob(''<Insert-your-file-filter-here>*.csv''):
#Do the work here
csv_in = open("<filename>.csv", "r")
csv_out = open("<filename>.csv", "w")
for line in csv_in:
field_list = line.split('','') # split the line at commas
output_line = '',''.join(field_list[0], # rejoin with commas, new order
field_list[2],
field_list[3],
field_list[4],
field_list[1]
)
csv_out.write(output_line)
csv_in.close()
csv_out.close()