여러 .csv 파일에서 검색된 고유 이름의 빈도를 포함하는 테이블을 만듭니다.

여러 .csv 파일에서 검색된 고유 이름의 빈도를 포함하는 테이블을 만듭니다.

데이터베이스에서 얻은 정보가 포함된 32개의 CSV 파일이 있습니다. 행 이름은 각 파일의 이름이고 열 이름은 파일 전체에서 발견되는 고유 이름인 TSV/CSV 형식의 빈도 테이블을 만들어야 합니다. 그런 다음 테이블은 각 파일의 각 이름에 대한 빈도 수로 채워져야 합니다. 가장 큰 문제는 모든 파일에 동일한 가져온 이름이 포함되어 있지 않다는 것입니다.

.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    

cutBash를 사용하여 두 번째 열과 sort이름 을 얻은 uniq다음 각 파일의 각 이름 수를 얻는 방법을 알고 있습니다 . 모든 이름을 표시하고 이름을 세고 파일에 이름이 없으면 "0"을 넣는 테이블을 만드는 방법을 모르겠습니다. 나는 보통 Bash를 사용하여 데이터를 정렬하지만 Python 스크립트도 작동합니다.

답변1

다음은 Python 2 및 3에서 작동하며 다음으로 저장 xyz.py하고 실행해야 합니다
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)

[0]정수를 직접 사용하는 것보다 카운터를 사용하여 값을 업데이트하는 것이 더 쉽습니다. 입력 파일이 더 복잡한 경우 Python의 CSV 라이브러리를 사용하여 읽는 것이 좋습니다.

관련 정보