如何构造复杂函数以应用于 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 导入的用户输入。目标是有一个函数 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
在此过程之后,必须在名为 recog_textX
的 free_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。但它看起来确实比循环遍历行更好
我有一个很大的(>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
在此过程之后,必须在名为 recog_textX
的 free_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。但它看起来确实比循环遍历行更好