当前位置: 首页 > 面试题库 >

如何使用Pandas中的Apply并行处理许多(模糊)字符串比较?

子车劲
2023-03-14
问题内容

我有以下问题

我有一个包含句子的数据框 母版 ,例如

master
Out[8]: 
                  original
0  this is a nice sentence
1      this is another one
2    stackoverflow is nice

对于Master中的每一行,我都会使用来查找另一个Dataframe Slave,
以获得最佳匹配fuzzywuzzy。我之所以使用Fuzzywuzzy,是因为两个数据框之间的匹配句子可能有所不同(其他字符等)。

例如, 奴隶 可能是

slave
Out[10]: 
   my_value                      name
0         2               hello world
1         1           congratulations
2         2  this is a nice sentence 
3         3       this is another one
4         1     stackoverflow is nice

这是一个功能齐全,精巧紧凑的工作示例:)

from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
import difflib


master= pd.DataFrame({'original':['this is a nice sentence',
'this is another one',
'stackoverflow is nice']})


slave= pd.DataFrame({'name':['hello world',
'congratulations',
'this is a nice sentence ',
'this is another one',
'stackoverflow is nice'],'my_value': [2,1,2,3,1]})

def fuzzy_score(str1, str2):
    return fuzz.token_set_ratio(str1, str2)

def helper(orig_string, slave_df):
    #use fuzzywuzzy to see how close original and name are
    slave_df['score'] = slave_df.name.apply(lambda x: fuzzy_score(x,orig_string))
    #return my_value corresponding to the highest score
    return slave_df.ix[slave_df.score.idxmax(),'my_value']

master['my_value'] = master.original.apply(lambda x: helper(x,slave))

一百万美元的问题是:我可以并行化上面的应用代码吗?

毕竟,将其中的每一行都master与其中的所有行进行比较slave(从属是一个小的数据集,我可以将许多数据副本保存到RAM中)。

我不明白为什么我不能运行多个比较(即同时处理多个行)。

问题:我不知道该怎么做,或者那是否可能。

任何帮助,不胜感激!


问题答案:

您可以将其与Dask.dataframe并行化。

>>> dmaster = dd.from_pandas(master, npartitions=4)
>>> dmaster['my_value'] = dmaster.original.apply(lambda x: helper(x, slave), name='my_value'))
>>> dmaster.compute()
                  original  my_value
0  this is a nice sentence         2
1      this is another one         3
2    stackoverflow is nice         1

另外,您应该在这里考虑使用线程与进程之间的权衡。模糊字符串匹配几乎可以肯定不会释放GIL,因此使用多个线程不会有任何好处。但是,使用进程将导致数据序列化并在您的计算机中移动,这可能会使速度变慢。

您可以通过管理方法的get=关键字参数,在使用线程和进程或分布式系统之间进行实验compute()

import dask.multiprocessing
import dask.threaded

>>> dmaster.compute(get=dask.threaded.get)  # this is default for dask.dataframe
>>> dmaster.compute(get=dask.multiprocessing.get)  # try processes instead


 类似资料:
  • Pandas 提供了一系列的字符串函数,因此能够很方便地对字符串进行处理。在本节,我们使用 Series 对象对常用的字符串函数进行讲解。 常用的字符串处理函数如下表所示: 函数名称 函数功能和描述 lower() 将的字符串转换为小写。 upper() 将的字符串转换为大写。 len() 得出字符串的长度。 strip() 去除字符串两边的空格(包含换行符)。 split() 用指定的分割符分割

  • 我们正在使用Crittercism来分析我们的应用程序崩溃,但是由于我们也使用带有默认模糊选项的DexGuard,Crittercism无法使用DexGuard生成的mappings.txt对堆栈痕迹进行模糊处理。 因此,我的问题很简单: 如何禁用DexGuard混淆的非ASCII字符? 顺便说一下,我们正在使用Gradle构建系统。

  • 我正在尝试使用附带的工具调试模糊代码中的异常。模糊标识符使用非ASCII字符,至少在生成的映射文件中是这样的,例如: 当我试图从设备导出堆栈跟踪以便将其馈送到时,这会造成问题。我的模糊设置是否有问题,或者使用非ASCII字符是否正常?如果是这样,我应该如何从设备导出堆栈跟踪以保留它们? 编辑:我后来发现了一种解决办法,它是以的形式输出二进制日志。这会导致日志文件有点难以读取,但堆栈跟踪中确实包含正

  • 问题内容: 我正在用Python学习。 我理解的概念,,和。我的问题是什么时候使用哪个功能? 我是否先检查2个字符串的长度,说不一样,然后排除? 如果两个字符串的长度相似,我将使用 ? 我应该一直使用吗? 有人知道SeatGeek使用什么标准? 我正在尝试建立一个房地产网站,想用来比较地址。 问题答案: 好问题。 我是SeatGeek的工程师,所以我想可以为您提供帮助。我们有一篇很棒的博客文章,很

  • 我正在使用与Freemarker启动的Spring Boot。 给定以下字符串: 我试图对这个字符串执行一些验证,以确保它包含正确的Freemarker语法。 ----提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-

  • 问题内容: PHP中有多字节字符串函数来处理多字节字符串(例如:CJK脚本)。例如,我想通过使用python中的函数来计算一个多字节字符串中有多少个字母,但是它返回的结果不准确(即该字符串中的字节数) PHP中有像mb_strlen这样的软件包或函数吗? 问题答案: 使用Unicode字符串: 注意字符串前面。 要将字节字符串转换为Unicode,请使用: