如何在pandas DataFrame中按连续Speaker分组拼接单词为句子?
解决方案
要实现按连续相同的Speaker拼接句子,不能直接用groupby('Speaker')(会把所有同Speaker的内容合并,忽略是否连续的逻辑),需要先给连续的同Speaker序列生成唯一分组标识,再进行分组拼接。
完整代码
import pandas as pd # 构造示例数据 data = { 'Index': [0,1,2,3,4,5,6,7,0,8,9,10,11,12,13,14,15,16,17,18,19,20], 'Speaker': ['spk_0']*7 + ['spk_1']*9 + ['spk_0']*4 + ['spk_2']*2, 'Word': ['can','you','see','my','screen','now','?','yes',',','now','I','can','see','your','screen','.', 'Let','me','start','then','yes','sure'] } df = pd.DataFrame(data) # 1. 生成连续Speaker的分组标识:当Speaker与上一行不同时,分组号递增 df['group_id'] = df['Speaker'].ne(df['Speaker'].shift()).cumsum() - 1 # 2. 按分组标识和Speaker分组,拼接Word为句子 result = df.groupby(['group_id', 'Speaker'])['Word'].apply(' '.join).reset_index() # 3. 调整列名和索引,匹配预期结果 result = result.rename(columns={'Word': 'Sentence'}).drop(columns='group_id') result = result.reset_index().rename(columns={'index': 'Index'}) # 可选:给无标点结尾的句子补全句号,对齐示例结果 result['Sentence'] = result['Sentence'].apply(lambda x: x + ' .' if not x.endswith(('.', '?')) else x) print(result)
代码说明
生成分组标识:
df['Speaker'].shift()获取上一行的Speaker值ne()判断当前行与上一行Speaker是否不同,返回布尔值cumsum()对布尔值累加(True=1,False=0),生成连续分组的唯一ID,最后减1让索引从0开始
分组拼接:
- 按
group_id和Speaker分组,确保只有连续的同Speaker会被分到一组 apply(' '.join)将每组的Word列用空格拼接成句子
- 按
结果调整:
- 重命名列名、重置索引,匹配预期输出结构
- 可选的标点补全:检查句子末尾是否有标点,没有则补充句号,和示例结果对齐
输出结果
| Index | Speaker | Sentence |
|---|---|---|
| 0 | spk_0 | can you see my screen now ? |
| 1 | spk_1 | yes , now I can see your screen . |
| 2 | spk_0 | Let me start then . |
| 3 | spk_2 | yes sure . |
内容的提问来源于stack exchange,提问作者shahzain
相关产品推荐
相关产品推荐

