Поиск мест расположения строк в текстовом файле - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть текстовый файл (file1) с строками, содержащими строковые записи .Первый элемент каждой строки соответствует метке, а все последующие записи каждой строки содержат строки.Возможно, что одни и те же строки могут отображаться в разных местах в нескольких строках.Разные строки в file1 имеют разное количество столбцов.

Рассмотрим это как пример file1 (вы можете скачать file1 с здесь ):

label1: aa  bb  dd  zz  yy  ww
label2: pp  qq  aa  ss
label3: mm  aa  gg  qq  rr  kk
label4: uu  ss  ll  pp
label5: hh  jj  qq  ss  uu

Независимо от file1, у меня есть одномерный массив NumPy (arr), который содержит строк ( уникальных записей ).Каждая строка в arr находит упоминание в одной или нескольких строках file1 (записи в файле1, за исключением первого столбца).Рассмотрим следующее в качестве примера arr.

arr = np.array(['aa', 'qq', 'ss', 'zz', 'ss', 'pp', 'dd'])

Используя python , я хочу сравнить arr с file1 и найти индексы строк в arr , которые похожи .Следующий пример иллюстрирует, как я хочу определить сходство: если entry1, entry4 и entry5 из arr имеют функцию в одной строке file1, тогда я хочу получить кортеж (или список) с индексами этих записей (1,4,5),Я хочу сделать это для всех таких групп.

В приведенном выше примере для arr и file1 мы видим, что ('aa', 'dd', 'zz') существует в первом ряду file1 (поэтому я бы хотелчтобы иметь кортеж (0,3,6).) Точно так же ('ss', 'pp') из arr функция в четвертом ряду file1, поэтому я хотел бы также иметь кортеж (4,5).Наконец, ('qq', 'ss') в пятом ряду file1 приведет к кортежу (1,2).

В настоящее время я сталкиваюсь с ошибкой при попытке прочитать file1.txt с использованием np.genfromtxt('file1.txt')

ValueError: Some errors were detected !
    Line #2 (got 5 columns instead of 7)
    Line #4 (got 5 columns instead of 7)
    Line #5 (got 6 columns instead of 7)

Как правильно прочитать file1 и добиться желаемого результата?Я буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Поскольку был запрос на ее решение на Python, без упоминания Pandas:

Используя python , я хочу сравнить arr с file1, и ...

Я могу предложить простой алгоритм работы:

arr = ['aa', 'qq', 'ss', 'zz', 'ss', 'pp', 'dd']
with open('file.csv') as inp:
    for line in inp.readlines(): # scan csv line by line
        words = line.strip().split(' ') # split line to words
        label = words[0]   # get label
        items = words[1:]  # get all but label
        lst = []           # result tuple/list for this line
        for i in range(len(arr)):   
            if arr[i] in items and arr.index(arr[i]) == i:
                lst.append(i)
        print ('{}: {}'.format(label, lst))

Обратите внимание, arr.index(arr[i]) == i проверяет, что элемент в массиве не дублируется

0 голосов
/ 29 ноября 2018

Вывод np.genfromtxt представляет собой массив, поэтому тот факт, что число столбцов в каждой строке варьируется, означает, что вам нужно соответствующим образом обрабатывать пропущенные значения.Вы можете рассмотреть возможность итерации по файлу с csv, но другой вариант будет просто использовать pd.read_csv, как это

> pd.read_csv('file1.txt', sep=r'\s+', header=None, dtype='|U').values[:,1:]
> array([['aa', 'bb', 'dd', 'zz', 'yy', 'ww'],
         ['pp', 'qq', 'aa', 'ss', nan, nan],
         ['mm', 'aa', 'zz', 'qq', 'rr', 'dd'],
         ['uu', 'ss', 'll', 'pp', nan, nan],
         ['hh', 'jj', 'qq', 'ss', 'uu', nan]], dtype=object)

Если важна производительность и строки действительно состоят из двух символов, вымог установить dtype='|S2' в конструкторе.В зависимости от версии pandas, которая вам нужна, вам также может потребоваться установить engine='python', чтобы избежать получения предупреждений о регулярном выражении (не делайте этого, если только у вас не возникнут проблемы, это медленнее и может быть ненужным).

У вашего arr есть дублирующий элемент в 2 и 4, но, если предположить, что все правильно, то все будет выглядеть так:

In [1] a=pd.read_csv('file1.txt', sep=r'\s+', header=None).values[:,1:].astype('<U2')
In [2] arr = np.array(['aa', 'qq', 'ss', 'zz', 'ss', 'pp', 'dd'])
In [3] [tuple(j for j, el in enumerate(arr) if el in set(a[i])) for i in range(len(a))]
Out[4] [(0, 3, 6), (0, 1, 2, 4, 5), (0, 1, 3, 6), (2, 4, 5), (1, 2, 4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...