我有一个sql表,其中12000个条目存储在数据帧df1中,如下所示:
我还有另一个表,它包含20000个条目,存储在dataframe df中:
目的是在一个条件为CA单元格值的长度应大于2的句子中,将df1中的名称与df中的CA(用“”空格分隔)的名称的每个可能组合进行匹配。最简单的逻辑是在句子中搜索df1中的所有名称值,如果找到匹配项,则在同一句子中搜索CA值。但这样做会限制资源的使用
下面是我尝试过的代码,我只能想到嵌套循环来完成任务。如果我使用两个函数,那么我将创建一个函数调用开销,如果我尝试递归,那么如果我超过Python中的递归函数调用,这将迫使内核关闭。 通过向其传递一个句子(我必须解析500k个句子)来调用以下函数:
def disease_search(nltk_tokens_sen):
for dis_index in range(len(df1)):
disease_name=df1.at[dis_index,'name']
regex_for_dis = rf"\b{disease_name}\b"
matches_for_dis= re.findall(regex_for_dis, nltk_tokens_sen, re.IGNORECASE | re.MULTILINE)
if len(matches_for_dis)!=0:
disease_marker(nltk_tokens_sen, disease_name)
如果上述函数找到匹配项,则调用此函数:
def disease_marker(nltk_tokens_sen, disease_name):
for zz in range(len(df)):
biomarker_txt=((df.at[zz,'CA']))
biomarker = biomarker_txt.split(" ")
for tt in range(len(biomarker)):
if len(biomarker[tt])>2:
matches_for_marker = re.findall(rf"\b{re.escape(biomarker[tt])}\b", nltk_tokens_sen)
if len(matches_for_marker)!=0:
print("Match_found:", disease_name, biomarker[tt] )
我是否需要完全改变我的逻辑,或者是否有一种Pythonic运行时有效的方法来实现它
根据粘贴在评论中的链接,您正在尝试循环浏览所有可用的疾病名称,以在给定的单词段落中查找疾病。我建议您循环阅读段落中的单词,并在数据框中找到匹配项
您可以尝试执行以下步骤
将nltk_标记拆分为单词列表,并将其命名为nltk_标记_单词
您可以使用诸如match&;之类的DF字符串过滤器,而不是在整个数据帧中循环查找给定单词列表中的匹配行;包含。这将减少整个DF的循环
filtered_rows = (df1['name'].str.contains(string) for string in nltk_tokens_words)
使用np和apply创建一个组合标记,以获得过滤后的DF
combined_mask = np.vstack(filtered_rows).all(axis=0)
df1[combined_mask]
对第二个DF重复相同的步骤
试试这个,让我知道这是否对你有帮助
优化和修改
结果:
新代码
文件:main.py
文件:process.py
文件:simulate_data.py
输出
示例1在单个句子上使用nltk语句
示例2在多个nltk句子上循环
定时测试
使用具有超过10K条记录的数据集(参见上面的simulated_data.py)
修改操作码(使定时比较公平)
修改的操作代码(用于对原始代码计时)
定时测试
使用Jupyter笔记本“神奇命令”
计时新代码
定时原始代码
试试这个,让我知道。由于访问结构(如列表和dict)比pandas数据帧更快,并且有效项的快速初步选择(不使用库re),因此这应该更具时间效率
相关问题 更多 >
编程相关推荐