按列表搜索数据框的最佳方法

时间:2019-07-11 10:18:13

标签: python pandas dataframe

我在第一个列中有一个具有该值的数据框:

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])

这是可行的...但是数据帧具有90xxx个样本,一次运行需要5-10分钟来处理。有人可以给我一些建议,例如如何通过熊猫来加快这个过程吗?

在这种情况下的结果应该是:

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

3 个答案:

答案 0 :(得分:3)

您可以将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 :(得分:1)

使用正则表达式

例如:

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']

答案 2 :(得分:1)

我在这里喜欢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)