Лучший способ поиска данных по списку - PullRequest
2 голосов
/ 11 июля 2019

У меня есть фрейм данных с этими значениями в одном из столбцов:

df.Sample
    POLSD233123
    POLRR419910
    POLAG002144
    DEUOD002139
    MEDOW203919
    ...

И я создаю список из другого df только с числовой частью числа (другая база): например

more = [419910, 983129,9128412,5353463,203919]

Итак, в списке у меня есть два числа, существующих в кадре данных. Мне нужно создать список общих и необычных значений.

Когда у меня будет общее, я тоже буду создавать необычное. Я просто пишу простой цикл в Python:

listOfRepetitionBase_SNPS = []
for i in range(len(more)):
    temp = baza[baza['Sample'].str.contains(more[i])]
    if len(temp) > 0:
        listOfRepetitionBase_SNPS.append(temp)
    else:
        print("no that record in base,", more[i])

И это работает ... но фрейм данных имеет 90ххх сэмплов, и один запуск занимает 5-10 минут на обработку. Может кто-нибудь дать мне совет, как сделать этот процесс быстрее, может быть, с помощью панд?

Результат в этом случае должен быть:

listOfRepetitionBase_SNPS =  419910, 203919
uncommon =  983129,9128412,5353463

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Вы можете превратить more в set и проверить членство с помощью any по всем строкам в фрейме данных:

s = set(map(str, more))
common = [i for i in s if any(i in row for row in df.Sample.values)]
# ['419910', '203919']
uncommon  = list(s.difference(common))
#['9128412', '5353463', '983129']
1 голос
/ 11 июля 2019

Мне нравится numpy здесь.

данные

    0
0  POLSD233123
1  POLRR419910
2  POLAG002144
3  DEUOD002139
4  MEDOW203919


с использованием np.setdiff1d
a = np.setdiff1d(df[0].str.extract(r'(\d+)')[0], more)
##print(a)
array(['002139', '002144', '233123'], dtype=object)

с использованием np.intersect1d

a = np.intersect1d(df[0].str.extract(r'(\d+)')[0], more)
##print(a) 
array(['203919', '419910'], dtype=object)
1 голос
/ 11 июля 2019

Использование Regex

Ex:

baza = pd.DataFrame({"Sample":['POLSD233123', 'POLRR419910', 'POLAG002144', 'DEUOD002139', 'MEDOW203919']})
more = [419910, 983129,9128412,5353463,203919]
c = "|".join(map(str, more))
common_list =  baza[baza['Sample'].str.contains(c, regex=True)].values.tolist()
uncommon =  baza[~baza['Sample'].str.contains(c, regex=True)].values.tolist()

import re

print([re.search(r"(\d+)", i[0]).group(1) for i in common_list])
print([re.search(r"(\d+)", i[0]).group(1) for i in uncommon])

Выход:

['419910', '203919']
['233123', '002144', '002139']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...