查找pandas数据帧中一组子字符串的计数

时间:2016-09-09 04:02:29

标签: pandas

我得到了一组子串。我需要找到数据帧中特定列中所有这些子串的出现次数。相关的数据框看起来像这样

  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]

2 个答案:

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

一些问题:

  • 如果你想要一个类似子串的东西' a' in' abcdefa'返回2,那么这将无法正常工作。它只检查每个字符串中是否存在子字符串。
  • apply()内,我使用的是对布尔值的可能不可靠的利用。有关详细信息,请参阅this question

编辑后:Jezrael的答案更完整,因为它使用相同的变量名称。但是,在一个简单的案例中,关于正则表达式与applyin的关系,我验证了他的主张和我的推定:

enter image description here