【问题标题】:Pandas Apply Function Working Very Slowly熊猫应用功能工作非常缓慢
【发布时间】:2021-07-16 21:09:50
【问题描述】:

我将以下函数传递给具有 300 万个 cmets 的 pandas 列,以提取形容词。我期待它可以很快完成,因为它可以在并行计算中完成。虽然它需要大约 5 个小时左右,就好像它是一个 for 循环一样。有没有可能解决这个问题?喜欢 Cython?

 def get_adjectives(row):
    clean_row=''
    if type(row)==str:
      for word in row.split():
        if nltk.pos_tag([word])[0][1] in ['JJ','JJR','JJS']:
          clean_row=clean_row+word+' '
    return clean_row

  df['adjectives'] = df[text_column].apply(get_adjectives)

【问题讨论】:

  • 以你的方式添加 n 个字符串是 O(n*n)。首先将它们放入列表并在最后加入 => O(n)。不需要 cython。
  • apply 必须每行运行一次 get_adjectives,即 300 万次。

标签: pandas lambda nltk apply cython


【解决方案1】:

基于@ead 的评论。试试这个:

def get_adjectives(row):
    clean_row = [] # list, not str
    if type(row)==str:
      for word in row.split():
        if nltk.pos_tag([word])[0][1] in ['JJ','JJR','JJS']:
          clean_row.append(word) # Appending to list
    
    clean_row = ' '.join(clean_row) # joining all words in list, separated by space
    return clean_row

df['adjectives'] = df[text_column].apply(get_adjectives)

【讨论】:

    【解决方案2】:

    这是一个快速修复,但如果您导入 swifter,它可以为您寻找矢量化解决方案:

     def get_adjectives(row):
        clean_row = ''
        if type(row) == str:
          for word in row.split():
            if nltk.pos_tag([word])[0][1] in ['JJ','JJR','JJS']:
              clean_row = clean_row + word + ' '
        return clean_row
    
     import swifter
     df['adjectives'] = df[text_column].swifter.apply(get_adjectives)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多