在两个DataFrame中搜索语句并提取关联页码的技术问询
嘿,我来帮你完成这个句子匹配页码的需求!你之前尝试了双重循环的思路,我给你补全并优化两种可行的实现方案,分别适合不同的场景:
先准备示例数据
首先我们先把你描述的两个DataFrame用代码还原出来,方便测试:
import pandas as pd # 你的单列句子DataFrame df = pd.DataFrame({'sentence': ['sentence1', 'sentence2', 'sentence3', 'sentence4']}) # 你的段落+页码DataFrame(模拟句子1在para1里,句子3在para2里) df_pages = pd.DataFrame({ 'paragraph': ['This is para1 containing sentence1', 'This is para2 with sentence3'], 'pagenumber': ['pg1', 'pg2'] })
方法1:直观的双重循环(适合小数据集)
这个方法和你最初的思路完全衔接,逻辑简单易懂,适合数据量不大的情况:
# 初始化列表存储每个句子对应的页码 matched_pages = [] # 遍历df里的每一个句子 for sentence in df['sentence']: page = None # 默认没找到时设为None,你也可以改成'未找到'之类的默认值 # 遍历df_pages的每一行段落和页码 for _, row in df_pages.iterrows(): # 检查句子是否在当前段落中 if sentence in row['paragraph']: page = row['pagenumber'] break # 找到匹配就跳出循环,不用继续检查其他段落了 matched_pages.append(page) # 把匹配结果加到原df中 df['matched_pagenumber'] = matched_pages
运行后df会新增一列matched_pagenumber,对应每个句子的匹配页码,没找到的会显示None。
方法2:高效的矢量化操作(推荐大数据集)
如果你的df_pages数据量很大,双重循环会很慢,这时候用pandas的矢量化方法会高效很多:
# 定义一个函数:输入句子,返回对应的页码 def find_matching_page(sentence): # 筛选出包含该句子的段落行(regex=False避免句子里的特殊字符被当成正则) matches = df_pages[df_pages['paragraph'].str.contains(sentence, regex=False, case=False)] # 如果有匹配结果,返回第一个页码;没有则返回None return matches['pagenumber'].iloc[0] if not matches.empty else None # 把函数应用到df的每个句子上 df['matched_pagenumber'] = df['sentence'].apply(find_matching_page)
这里的str.contains是pandas内置的向量化字符串方法,比手动循环快得多。参数case=False是忽略大小写匹配,如果你需要严格区分大小写,可以去掉这个参数;regex=False是确保句子里的特殊字符(比如.、*)不会被当成正则表达式处理,保证精确匹配。
额外小提示
- 如果一个句子在多个段落中出现,上面的方法只会返回第一个匹配的页码。如果你需要所有匹配的页码,可以把返回值改成
','.join(matches['pagenumber']),这样会用逗号分隔所有匹配的页码。 - 如果你需要更严格的匹配(比如句子是段落里的独立完整句子,而不是子串),可以调整匹配逻辑,比如用正则匹配完整句子边界:
str.contains(r'\b' + re.escape(sentence) + r'\b', case=False),记得先导入re模块。
内容的提问来源于stack exchange,提问作者V Shriram
相关产品推荐
相关产品推荐

