我有一只很大(>500k行)的熊猫,就像这样
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处理单个strs而不是一系列strs。对我来说,这些接口概念似乎不相容。但出于性能原因,我确实希望在这里避免经典的迭代。我在这里对熊猫的了解太浅了。帮我一把?
发布于 2020-11-01 04:39:38
我可能漏掉了一点,但您可以使用apply函数来获得我认为您想要的东西:
orig_df['recog_textX'] = orig_df['free_textX'].apply(func)这将通过将函数func应用于'free_textX‘列的每个元素来创建一个新的列’free_textX‘。
如果我误解了你的问题,请告诉我
顺便说一句,我认为向量化这个操作在速度上不会有什么不同,因为func()的每个应用程序都是一个复杂的字符串操作。但是它看起来确实比仅仅通过行循环要好。
https://stackoverflow.com/questions/64624710
复制相似问题