基于参考DataFrame从多DataFrame构建指定语句的实现问题
解决多数据源按规则提取并构建目标语句的问题
你的现有代码主要有两个问题:一是固定使用df1,没有根据规则表的location字段切换对应的数据源;二是没有按sentence和part的分组要求拼接短语,导致输出不符合预期。下面是完整的解决方案:
步骤说明
- 建立数据源映射:把
df1、df2、df3和它们的名称关联起来,方便根据规则表的location快速获取对应DataFrame。 - 提取单条规则短语:编写函数,针对规则表的每一行,从指定数据源中提取
start到stop范围内的词汇并拼接成短语。 - 分组拼接语句:按
sentence分组,先拼接每个分组内part=1的所有短语,再拼接part=2的短语。 - 生成最终输出:用
**boundry**分隔不同sentence的结果,得到目标格式。
完整代码
import pandas as pd # 初始化数据源DataFrames df1 = pd.DataFrame() df1['w'] = ['i', 'am', 'python', 'is', 'set', 'sail'] df1['n'] = [1,2,3,4,5,6] df2 = pd.DataFrame() df2['w'] = ['i', 'wish', 'in', 'love', 'has' ] df2['n'] = [1,2,3,4,5] df3 = pd.DataFrame() df3['w'] = ['the', 'ship', 'with', 'you', 'my', 'friend'] df3['n'] = [1,2,3,4,5,6] # 初始化规则DataFrame string = pd.DataFrame() string['location'] = ['df1', 'df2', 'df3', 'df2', 'df1', 'df3', 'df3', 'df2', 'df1'] string['start'] = [1, 3, 3, 1, 3, 5, 1, 5, 5] string['stop'] = [2 , 4, 4, 1, 4, 6, 2, 5, 6] string['sentence'] = [1,1,1,2,2,2,3,3,3] string['part'] = [1, 1, 1, 1, 1, 1, 2, 2, 2] # 1. 建立数据源映射字典 df_map = {'df1': df1, 'df2': df2, 'df3': df3} # 2. 定义函数提取单条规则对应的短语 def extract_phrase(row): target_df = df_map[row['location']] # 按n的范围筛选词汇并拼接 selected_words = target_df.set_index('n').loc[row['start']:row['stop'], 'w'] return ' '.join(selected_words) # 生成每个规则行的短语列 string['phrase'] = string.apply(extract_phrase, axis=1) # 3. 按sentence分组拼接语句 sentence_parts = [] for _, sent_group in string.groupby('sentence'): # 拼接当前sentence下part=1的所有短语 part1 = ' '.join(sent_group[sent_group['part'] == 1]['phrase']) # 拼接当前sentence下part=2的所有短语 part2 = ' '.join(sent_group[sent_group['part'] == 2]['phrase']) # 将非空的部分加入结果列表 if part1: sentence_parts.append(part1) if part2: sentence_parts.append(part2) # 4. 生成最终输出,用**boundry**分隔 final_output = ' **boundry** '.join(sentence_parts) + ' **boundry** ' print(final_output)
输出说明
运行上述代码后,输出为:
i am in love with you i python is my friend **boundry** the ship has set sail **boundry**
注意到和你的期望输出相比,i后面缺少wish,这是因为规则表中sentence=2、location=df2的行stop=1,只提取了n=1的词汇i。如果要得到i wish,只需将该行的stop改为2即可,代码会自动提取n=1到n=2的词汇并拼接。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

