我在数据框中有一列:900k行。熊猫系列的结构:
base['SampleID']
=
231233
124123
213h213
jkiu12341
213i12i24u
我还有一个listOfNames
包含84k字符串
例如listOFNames =[jkiu12341,das2123,233213,321n3ju213]
我需要做什么?
我需要将列表中的每个值与数据系列(base['SampleID]'
)行进行比较,并检查其中是否包含重复项。
如果脚本在Series中找到相同的值,则应将其保存(附加)到另一个DataFrame,否则应通过。
问题:
我需要使用正则表达式,因为有时在列表中,例如ff5434
,当使用系列:“ 00ff5434”时-应该将其视为重复。
我用python编写了一个函数,但是它非常慢。相比之下,900k行需要35-40分钟。
我的代码:
found = 0
notfound = 0
for i in range(len(listOfNames)):
if len(base[base['SampleId'].str.contains(listOfNames[i], regex=False)]) > 0 :
found += 1
else:
notfound+= 1
for loop
扫描整个系列非常简单。而且它还没有将建立的行追加到数据帧中,只是计算出我有多少次重复。
预期结果:
具有重复的数据帧。在上面的示例中,它将是:仅数据框或列表包含jkiu12341
。
也许有人知道本机熊猫函数,或者其他任何库都可以更快地完成它并替换我的for函数?
答案 0 :(得分:1)
答案 1 :(得分:1)
You can use isin to find the value in a list, you can do the following code:
df = pd.DataFrame({ 'base': ['231233', '124123', '213h213', 'jkiu12341',
'213i12i24u'],})
listOFNames =['jkiu12341','das2123','233213','321n3ju213']
# Result as a list
output=list(df.base[df['base'].isin(listOFNames)])
print(output)
# Result as a DataFrame
df_result=pd.DataFrame(output,columns=['output'])
print(df_result)
Output:
['jkiu12341']
output
0 jkiu12341
time that is needed to execute search operation:
%timeit output=list(df.base[df['base'].isin(listOFNames)])
585 µs ± 46.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)