在Pandas DataFrame中按sente分组并生成句子列表
解决Pandas分组拼接句子的问题
这问题我熟,咱们一步步来搞定它:
首先,你的核心需求是把sente值相同的行归为一组,然后按id的顺序把value列的词语拼接成完整句子,最后组成列表。这里要注意一个细节:标点符号(比如!和.)和前面的词语之间不能有空格,直接用空格拼接会出现多余空格,得针对性处理一下。
完整代码示例
import pandas as pd # 先还原你的示例DataFrame df = pd.DataFrame({ 'id': [1,2,3,4,5,1,2,3,4,5], 'pos': ['a','b','b','a','d','a','a','b','a','d'], 'value': ['I','have','a','cat','!','My','cat','is','cute','.'], 'sente': [21,21,21,21,21,22,22,22,22,22] }) # 自定义拼接函数,处理标点符号的空格问题 def build_sentence(group): # 先按id排序,保证词语顺序和原句一致 sorted_words = group.sort_values('id')['value'].tolist() sentence = '' for word in sorted_words: # 判断是否是标点符号,按需添加空格 if word in ['!', '.', '?', ',']: sentence += word else: if sentence: sentence += ' ' sentence += word return sentence # 分组拼接并转成目标列表 final_result = df.groupby('sente').apply(build_sentence).tolist() print(final_result) # 输出: ["I have a cat!", "My cat is cute."]
代码细节解释
- 分组逻辑:
df.groupby('sente')把所有sente值相同的行打包成一组,确保同一句子的词语不会分散在不同组里。 - 顺序保障:每个组内按
id排序,因为id对应词语在句子中的位置序号,这样能保证拼接顺序完全符合原句的语序。 - 智能拼接:自定义的
build_sentence函数会判断当前内容是词语还是标点——词语前加空格(第一个词除外),标点直接跟在前面的内容后,完美避免了"cat !"这种多余空格的问题。 - 格式转换:最后用
.tolist()把分组后的结果转换成你需要的列表格式。
如果你的标点类型更多,只需要在if word in [...]里添加对应的符号就行,灵活性拉满。
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

