首页 > 解决方案 > 如何构造复杂函数以应用于 pandas df 的 col?

问题描述

我有一个大的(> 500k 行)pandas df 像这样

orig_df = pd.DataFrame(columns=list('id', 'free_text1', 'something_inert', 'free_text2'))

free_textX是一个字符串字段,包含从 csv 导入的用户输入。目标是有一个函数func对每一行进行各种检查,free_textX然后根据另一个 df 引用的内容执行 Levenshtein 模糊文本识别。就像是

from rapidfuzz import process
LEVENSHTEIN_DIST = 25

def func(s) -> str:
  if string == "25":
    return s
  elif s == "nothing":
    return "something"
  else:
    s2 = process.extractOne(
           query = s,
           choices = reference['col_name'],
           score_cutoff = LEVENSHTEIN_DIST
           )
    return s2

在此过程之后,必须在free_textX调用后插入一个新列,recog_textX其中包含来自 的返回值func

我像这样尝试了矢量化(为了性能)

orig_df.insert(loc=new_col_index, #calculated before
               column='recog_textX',
               value=func(orig_df['free_textX'])
               )

def func(series) -> pd.core.series.Series:
  ...

但我不明白如何构造func(根据矢量化的要求将整个 df col 作为一个系列处理,对吧?)作为process.extractOne(...) -> str处理单个 strs 而不是系列。这些接口概念对我来说似乎不兼容。但出于性能原因,我确实想在这里避免经典迭代。我对 pandas 的了解在这里太浅了。帮帮我?

标签: pythonpandasdataframevectorization

解决方案


我可能遗漏了一点,但你可以使用apply函数来获得我认为你想要的:

orig_df['recog_textX'] = orig_df['free_textX'].apply(func)

这将通过将您的函数func应用于“free_textX”列的每个元素来创建一个新列“recog_textX”。

如果我误解了你的问题,请告诉我

顺便说一句,我认为向量化这个操作不会在速度方面产生任何影响,因为每个应用程序func()都是一个复杂的字符串操作。但它看起来确实比循环遍历行更好


推荐阅读