Pandas保留原顺序将元组转为按连续docid分组的DataFrame
问题根源
你之前使用的全局groupby('docid')逻辑是对所有相同docid做全量聚合,天然会跨位置合并所有同docid记录,既会破坏原始排列顺序,也无法满足「仅合并相邻重复docid」的要求。
实现方案
核心思路是先为连续重复的docid片段生成独立的分组标识,再基于这个临时标识做聚合,既能保留原始顺序,也不会跨片段合并同docid记录。
完整可运行代码如下:
import pandas as pd res1_ = [ ('z1', '1'), ('z1', '2'), ('x1', '1'), ('x2', '1'), ('x1', '3'), ('z1', '1')] # 转换为基础DataFrame df = pd.DataFrame(res1_, columns=['docid','secid']) # 生成连续块标识:当前行docid与上一行不同时,标识值+1 df['block_tag'] = (df['docid'] != df['docid'].shift()).cumsum() # 按连续块聚合,将同块secid合并为列表 result = df.groupby(['block_tag', 'docid'], as_index=False)['secid'].apply(list) # 删除临时标识列,得到最终结果 result = result.drop(columns='block_tag')
运行后输出结果完全匹配预期:
docid secid 0 z1 [1, 2] 1 x1 [1] 2 x2 [1] 3 x1 [3] 4 z1 [1]
关键逻辑说明
df['docid'].shift()会把docid列整体向下错位一行,用来对比当前行和上一行的docid是否一致- 当相邻行docid不一致时返回True(等价于数值1),一致时返回False(等价于数值0),对布尔序列做
cumsum()累加后,每一段连续相同的docid都会获得同一个唯一的块标识 - 聚合时将块标识作为第一分组键,聚合结果会严格遵循原始数据的出现顺序,不会把中间隔了其他docid的同值记录错误合并。
内容的提问来源于stack exchange,提问作者usr_lal123
相关产品推荐
相关产品推荐

