python: объединить несколько файлов в матрицу с 1 и 0 - PullRequest
0 голосов
/ 14 июля 2020

Есть несколько таких файлов:

sample_a.txt содержащий:

a
b
c

sample_b.txt содержащий:

b
w
e

sample_ c .txt содержащий:

a
m
n

Я хочу сделать матрицу отсутствия / присутствия вот так:

            a    b    c    w    e    m    n
sample_a    1    1    1    0    0    0    0
sample_b    0    1    0    1    1    0    0
sample_c    1    0    0    0    0    1    1

Я знаю грязный и глупый способ решить эту проблему: составить список всех возможных букв в этих файлах, а затем итеративно сравнить каждую строку каждого файла с этой «библиотекой», заполнить окончательную матрицу по индексу. Но я думаю, есть более разумное решение. Есть идеи?

Upd: файлы sample могут иметь разную длину.

1 Ответ

2 голосов
/ 14 июля 2020

Вы можете попробовать:

import pandas as pd
from collections import defaultdict
dd = defaultdict(list) # dictionary where each value per key is a list

files = ["sample_a.txt","sample_b.txt","sample_c.txt"]
for file in files:
    with open(file,"r") as f:
        for row in f:
            dd[file.split(".")[0]].append(row[0]) 
            #appending to dictionary dd:
            #KEY: file.split(".")[0] is file name without extension
            #VALUE: row[0] is first character of line in text file
            # (second character was new line '\n' so I removed it)
    
df = pd.DataFrame.from_dict(dd, orient='index').T.melt() #converting dictionary to long format of dataframe
pd.crosstab(df.variable, df.value) #make crosstab, similar to pd.pivot_table

результат:

value     a  b  c  e  f  m  n  o  p  w
variable                              
sample_a  1  1  1  0  0  0  0  0  0  0
sample_b  0  1  0  1  1  0  0  0  0  1
sample_c  1  0  0  0  0  1  1  1  1  0

Обратите внимание, что буквы (столбцы) расположены в алфавитном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...