如何使用Pandas对聊天会话数据集按用户分组并按message_id排序
实现方法
要实现按会话分组再按时序排序,核心是生成一个不区分收发方向的会话对标识,让两个用户之间的所有消息都归属到同一个分组下,再利用全局自增的message_id做组内排序就能还原对话顺序。
完整代码示例
import pandas as pd # 1. 构造示例数据集(如果是从文件读取可以用pd.read_csv等方法) raw_data = [ [123, 'al', 'sal', 'hi'], [871, 'al', 'hal', 'hey'], [989, 'al', 'bob', 'me too'], [900, 'sal', 'sal', 'hello'], [107, 'bob', 'al', "i'm bob"], [242, 'sal', 'al', 'how are you?'], [101, 'al', 'bob', "hi, i'm al"], [898, 'sal', 'al', "i'm good"] ] df = pd.DataFrame(raw_data, columns=['message_id', 'to_user', 'from_user', 'message']) # 2. 生成会话对标识:将收发方排序后组成元组,确保同一会话的标识唯一 df['chat_pair'] = df.apply(lambda row: tuple(sorted([row['to_user'], row['from_user']])), axis=1) # 可选:过滤掉单条无交互的会话、自己给自己发的消息 # 过滤单条会话:df = df.groupby('chat_pair').filter(lambda x: len(x) > 1) # 过滤自发消息:df = df[df['to_user'] != df['from_user']] # 3. 排序:先按会话对分组,组内按message_id升序还原时序 df_sorted = df.sort_values(by=['chat_pair', 'message_id']).reset_index(drop=True) # 4. 删除辅助列,得到最终结果 df_sorted = df_sorted.drop(columns=['chat_pair']) print(df_sorted)
逻辑说明
- 会话对标识用
sorted处理是为了消除收发方向的差异,比如al→bob和bob→al排序后得到的元组都是('al', 'bob'),自然会被分到同一组 message_id是数据库全局索引,id越小代表消息发送时间越早,组内按id升序就能完全还原真实的对话先后顺序
内容的提问来源于stack exchange,提问作者minimalpop
相关产品推荐
相关产品推荐

