Crear tabla con frecuencia de nombres únicos recuperados de múltiples files .csv

Tengo 32 files CSV que contienen información extraída de una database. Necesito hacer una tabla de frecuencias en formatting TSV / CSV, donde los nombres de las filas son el nombre de cada file, y los nombres de las columnas son los nombres únicos que se encuentran en todos los files. La tabla necesita ser poblada con el recuento de frecuencia de cada nombre para cada file. El mayor problema es que no todos los files contienen los mismos nombres obtenidos.

input de .csv :

 $cat file_1 name_of_sequence,C cc,'other_information' name_of_sequence,C cc,'other_information' name_of_sequence,C cc,'other_information' name_of_sequence,D dd,'other_information' ... $cat file_2 name_of_sequence,B bb,'other_information' name_of_sequence,C cc,'other_information' name_of_sequence,C cc,'other_information' name_of_sequence,C cc,'other_information' ... $cat file_3 name_of_sequence,A aa,'other_information' name_of_sequence,A aa,'other_information' name_of_sequence,A aa,'other_information' name_of_sequence,A aa,'other_information' ... $cat `.csv/.tsv` output: taxa,A aa,B bb,C cc,D dd File_1,0,0,3,1 File_2,0,1,3,0 File_3,4,0,0,0 

Usando bash sé cómo cut la segunda columna, sort y uniq los nombres, y luego get un recuento para cada nombre en cada file. No sé cómo hacer una tabla que muestre todos los nombres, cuente y coloque un "0 cuando el nombre no exista en el file". Normalmente clasifico datos con Bash, pero un script de python también puede funcionar.

Lo siguiente debería funcionar con python 2 y 3, save como xyz.py y ejecutar con
python xyz.py file_1 file_2 file_3 :

 import sys import csv names = set() # to keep track of all sequence names files = {} # map of file_name to dict of sequence_names mapped to counts # counting for file_name in sys.argv[1:]: # lookup the file_name create a new dict if not in the files dict b = files.setdefault(file_name, {}) with open(file_name) as fp: for line in fp: x = line.strip().split() # split the line names.add(x[1]) # might be a new sequence name # retrieve the sequence name or set it if not there yet # what would not work is "i += 1" as you would need to assign # that to b[x[1]] again. The list "[0]" however is a reference b.setdefault(x[1], [0])[0] += 1 # output names = sorted(list(names)) # sort the unique sequence names for the columns grid = [] # create top line top_line = ['taxa'] grid.append(top_line) for name in names: top_line.append(name) # append each files values to the grid for file_name in sys.argv[1:]: data = files[file_name] line = [file_name] grid.append(line) for name in names: line.append(data.get(name, [0])[0]) # 0 if sequence name not in file # dump the grid to CSV with open('out.csv', 'w') as fp: writer = csv.writer(fp) writer.writerows(grid) 

Usar [0] para los contadores hace que sea más fácil actualizar el valor que usar integers directamente. Si los files de input son más complejos, es mejor leerlos con la biblioteca CSV de Python.