我在第一个列中有一个具有该值的数据框:
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
答案 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
a = np.setdiff1d(df[0].str.extract(r'(\d+)')[0], more)
##print(a)
array(['002139', '002144', '233123'], dtype=object)
a = np.intersect1d(df[0].str.extract(r'(\d+)')[0], more)
##print(a)
array(['203919', '419910'], dtype=object)