You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:00:50