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

Pandas如何基于其他行值赋值,快速提取同线号对应前页的text字段?

可行实现方案

方案1:页码连续场景(最简写法)

如果你的数据中所有行号对应的页码都是连续递增、没有缺页的情况,直接用groupby + shift的向量化操作即可,全程不需要自定义函数,性能远高于apply实现:

  • 第一步:按行号、页码升序排序,保证同个行号下的页码顺序正确
df = df.sort_values(by=['line_number', 'page_number'], ignore_index=True)
  • 第二步:按行号分组,组内将text列向下偏移1位,即为上一页的同号行文本
df['prev_text'] = df.groupby('line_number')['text'].shift(1)

如果需要保留原始数据的排序,可在排序前新增一列存储原始索引,操作完成后恢复顺序:

df['orig_index'] = df.index
# 执行上述排序、赋值操作
df = df.sort_values(by='orig_index').drop(columns='orig_index')

方案2:页码可能不连续场景(严谨通用)

如果存在行号缺页的情况(比如某行号只有第1、3页,没有第2页),方案1会把第1页的文本赋值给第3页的prev_text,不符合你“仅当前一页(page_number-1)存在时生效”的要求,这时用左连接实现更准确:

# 构造匹配用的辅助表,存储所有行号+页码对应的文本
match_df = df[['page_number', 'line_number', 'text']].rename(columns={'text': 'prev_text'})
# 给原表加一个匹配键:当前页码-1
df['match_page'] = df['page_number'] - 1
# 按行号、匹配页码做左连接,得到对应的前一页文本
df = df.merge(match_df, how='left', left_on=['line_number', 'match_page'], right_on=['line_number', 'page_number'], suffixes=('', '_right'))
# 删掉辅助字段
df = df.drop(columns=['match_page', 'page_number_right'])

性能说明

两种方案都是基于Pandas底层优化的向量化操作,比自定义apply遍历的效率高1~2个数量级,数据量越大优势越明显,不需要自行构建二维索引数组。

内容的提问来源于stack exchange,提问作者Marek Kubowicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:06