用lis搜索数据帧的最佳方法

2024-05-19 12:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,其中一列中有值:

df.Sample
    POLSD233123
    POLRR419910
    POLAG002144
    DEUOD002139
    MEDOW203919
    ...

我从另一个只包含数字部分(不同基)的df创建列表:例如

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

所以在列表中,数据帧中有一个2的数字。我需要建立一个共同和不寻常的价值清单。你知道吗

当我有了共同点,我也会创造不平凡。我只是用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

Tags: 数据sampleindataframedf列表lenmore
3条回答

使用正则表达式

例如:

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

您可以将more转换为set,并检查数据帧中所有字符串的^{}成员身份:

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

我喜欢这里。你知道吗

data

    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)

相关问题 更多 >