如何高效合并Pandas DataFrame中同会话内连续用户的文本行
高效合并同会话内连续用户的文本内容
问题场景
现有如下Pandas DataFrame,包含会话ID、用户和文本三列:
import pandas as pd data = [[1, "User1", "Hello."], [1, "User1", "How are you?"], [1, "User2", "I'm fine."], [2, "User1", "Nice to meet you."], [2, "User2", "Hello."], [2, "User2", "I'm happy."], [2, "User2", "Goodbye."], [3, "User2", "Hello."]] df = pd.DataFrame(data, columns=['Conversation', 'User', 'Text'])
对应的DataFrame内容:
Conversation User Text 0 1 User1 Hello. 1 1 User1 How are you? 2 1 User2 I'm fine. 3 2 User1 Nice to meet you. 4 2 User2 Hello. 5 2 User2 I'm happy. 6 2 User2 Goodbye. 7 3 User2 Hello.
需求:不跨越会话边界,合并同一会话内连续同一用户的文本(用空格拼接),新会话开始时重新独立处理,期望结果如下:
Conversation User Text 0 1 User1 Hello. How are you? 2 1 User2 I'm fine. 3 2 User1 Nice to meet you. 4 2 User2 Hello. I'm happy. Goodbye. 7 3 User2 Hello.
高效实现方案
针对大数据量场景,推荐使用Pandas的向量化分组+聚合操作,避免循环,保证处理效率:
# 1. 生成连续分组标识:当会话或用户发生变化时,标记为新分组 df['group_id'] = df[['Conversation', 'User']].ne(df[['Conversation', 'User']].shift()).any(axis=1).cumsum() # 2. 按会话和分组标识聚合,拼接文本 result = df.groupby(['Conversation', 'group_id', 'User'], as_index=False)['Text'].agg(' '.join) # 3. 还原原DataFrame的起始索引(可选,匹配示例结果索引) result.index = df.groupby(['Conversation', 'group_id']).head(1).index # 4. 移除临时分组列 result = result.drop('group_id', axis=1) print(result)
代码说明
- 步骤1通过向量化对比生成分组ID:对比当前行与上一行的会话、用户是否不同,只要有一个维度变化就标记为新分组,再通过累加得到唯一的分组标识,确保同会话内连续相同用户属于同一组。
- 步骤2的
groupby+agg是Pandas底层优化的聚合操作,基于C实现,处理百万级数据仍能保持高效。 - 步骤3可选,用于还原原DataFrame中每组的起始行索引,和示例结果的索引完全匹配;若不需要保留原索引,可直接跳过。
输出结果
运行代码后将得到与需求完全一致的结果:
Conversation User Text 0 1 User1 Hello. How are you? 2 1 User2 I'm fine. 3 2 User1 Nice to meet you. 4 2 User2 Hello. I'm happy. Goodbye. 7 3 User2 Hello.
内容的提问来源于stack exchange,提问作者BlackHawk
相关产品推荐
相关产品推荐

