如何方便地在熊猫中搜索重复值?

时间:2019-05-31 10:38:26

标签: python string pandas

我在数据框中有一列: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函数?

2 个答案:

答案 0 :(得分:1)

where中的pandas怎么样?信息here。还是where中的numpy?信息here

@ anky_91指出,没有一个简单,完整且可验证的示例(mcve)很难做到。

答案 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)