我得到了一组子串。我需要找到数据帧中特定列中所有这些子串的出现次数。相关的数据框看起来像这样
training['concat']
0 svAxu$paxArWAn
1 xvAxaSa$varRANi
2 AxAna$xurbale
3 go$BakwAH
4 viXi$Bexena
5 nIwi$kuSalaM
6 lafkA$upamam
7 yaSas$lipsoH
8 kaSa$AGAwam
9 hewumaw$uwwaram
10 varRa$pUgAn
我的子串集是一个字典,其中键是子字符串,值是它们出现的概率
reg = {'anuBavAn':0.35, 'a$piwra':0.2 ...... 'piwra':0.7, 'pa':0.03, 'a':0.0005}
#The length of dicitioanry is 2000
特别是我需要找到那些出现两次以上的子串
我编写了以下执行任务的代码。是否有更优雅的pythonic方式或panda特定的方式来实现相同的当前实现需要相当长的时间来执行。
elites = dict()
for reg_pat in reg_:
count = 0
eliter = len(training[training['concat'].str.contains(reg_pat)]['concat'])
if eliter >=3:
elites[reg_pat] = reg_[reg_pat]
答案 0 :(得分:2)
您可以使用apply
代替str.contains
,速度更快:
reg_ = {'anuBavAn':0.35, 'a$piwra':0.2, 'piwra':0.7, 'pa':0.03, 'a':0.0005}
elites = dict()
for reg_pat in reg_:
if training['concat'].apply(lambda x: reg_pat in x).sum() >= 3:
elites[reg_pat] = reg_[reg_pat]
print (elites)
{'a': 0.0005}
答案 1 :(得分:2)
希望我能正确地解释你的问题。我倾向于远离正则表达式(事实上,我从未将它与大熊猫一起使用),但严格来说,这并没有错。无论如何,我发现很难相信任何正则表达式操作都比简单的in
检查更快,但我可能错了。
for substr in reg:
totalStringAppearances = training.apply((lambda string: substr in string))
totalStringAppearances = totalStringAppearances.sum()
if totalStringAppearances > 2:
reg[substr] = totalStringAppearances / len(training)
else:
# do what you want to with the very rare substrings
一些问题:
apply()
内,我使用的是对布尔值的可能不可靠的利用。有关详细信息,请参阅this question。编辑后:Jezrael的答案更完整,因为它使用相同的变量名称。但是,在一个简单的案例中,关于正则表达式与apply
和in
的关系,我验证了他的主张和我的推定: