Pandas 在dataframe中查找一组子字符串的计数

Pandas 在dataframe中查找一组子字符串的计数,pandas,Pandas,我得到了一组子字符串。我需要找到数据帧中特定列中所有这些子字符串的出现次数。相关的datframe将如下所示 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

我得到了一组子字符串。我需要找到数据帧中特定列中所有这些子字符串的出现次数。相关的datframe将如下所示

  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]

您可以使用
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}

希望我正确地解释了你的问题。我倾向于远离这里的正则表达式(事实上,我从来没有和熊猫一起使用过它),但严格地说,这并没有错。在任何情况下,我发现很难相信任何正则表达式操作都比简单的检查中的快,但我可能在这一点上错了

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
一些陷阱:

  • 如果希望'abcdefa'中的子字符串'a'返回2,那么这将不起作用。它只检查每个字符串中是否存在子字符串
  • apply()。有关更多详细信息,请参阅

后期编辑:Jezrael的答案更完整,因为它使用相同的变量名。但是,在一个简单的案例中,关于regex vs.
apply
in
,我证实了他的说法,以及我的假设:


训练有多大?训练就像9000行一样,x中的reg_pat是否有效,如果reg_pat是regex模式?不,那么它不起作用。如果正则表达式为,则需要
str.contains