如何构造复杂函数以应用于 pandas df 的 col?

How to structure complex function to apply to col of pandas df?

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

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

free_textX 是一个字符串字段,包含从 csv 导入的用户输入。目标是有一个函数 funcfree_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

在此过程之后,必须在名为 recog_textXfree_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 处理单个 str 而不是一个系列.这些界面概念对我来说似乎不兼容。但出于性能原因,我确实想在这里避免经典迭代。我在这里对 pandas 的掌握太浅了。帮帮我?

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

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

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

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

顺便说一句,鉴于 func() 的每个应用程序都是一个复杂的字符串操作,我认为矢量化此操作不会有任何不同 speed-wise。但它看起来确实比循环遍历行更好