python - 如何构造复杂函数以应用于 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 的了解在这里太浅了。帮帮我?
解决方案
我可能遗漏了一点,但你可以使用apply
函数来获得我认为你想要的:
orig_df['recog_textX'] = orig_df['free_textX'].apply(func)
这将通过将您的函数func
应用于“free_textX”列的每个元素来创建一个新列“recog_textX”。
如果我误解了你的问题,请告诉我
顺便说一句,我认为向量化这个操作不会在速度方面产生任何影响,因为每个应用程序func()
都是一个复杂的字符串操作。但它看起来确实比循环遍历行更好
推荐阅读
- reactjs - React 列表组件(如文件管理器)
- javascript - OverPassLayer 标记的传单性能不佳
- python - 拆分数据集而不使用 Scikit-Learn train_test_split
- python - 尝试从循环中的字典中弹出 KV 对时出错
- r - Cholmod 错误“内存不足”:合并 Seurat 对象
- python - 如何去除列表中每个项目的前 2 个字符以外的所有内容?
- laravel - 检索条件唯一的行
- .net - 在 .NET 中调用应用程序 wsdl
- python - 如何编写包装 R 文件以执行 .sh 文件
- opengl-es - opengl-es 2.0 normal 对我来说看起来不太正常