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

Pandas如何按POS非空行合并拼接跨行拆分的字符串

Pandas 规整PDF解析后跨行拆分的表格数据

核心逻辑

所有跨行拆分的内容,都归属到它上方最近的POS列非空的基准行,先给每行打所属基准行的分组标记,再按分组把各列字符串向上拼接即可。

操作步骤

  • 给所有行生成分组标识:对POS列做向前填充(ffill),把基准行的POS值填充到下方所有空POS的跨行记录上,同一分组的记录就是需要合并到同一个基准行的内容。
  • 按分组做聚合:POS列取组内第一个有效值,其余文本列跳过空值后,用空格拼接同组内所有非空字符串。
  • 清理拼接后字符串首尾、中间的多余空格,得到最终规整表格。

可直接运行的代码

import pandas as pd

# df 为读取得到的原始DataFrame
# 1. 生成分组key
df["group_key"] = df["POS"].ffill()

# 2. 定义文本拼接逻辑:自动跳过空值,拼接后去除多余空格
def merge_text(col_series):
    valid_parts = [str(item).strip() for item in col_series if pd.notna(item)]
    return " ".join(valid_parts).strip()

# 3. 按分组聚合,所有文本列调用merge_text,数值类列取组内第一个值
# 原数据共14列,其余列可参照下方格式补充聚合规则
df_clean = df.groupby("group_key", as_index=False).agg(
    POS=("POS", "first"),
    APLICAÇÃO=("APLICAÇÃO", merge_text),
    NOMECLATURA=("NOMECLATURA", merge_text),
    UOM=("UOM", merge_text)
).drop(columns=["group_key"]) # 删除临时分组列

处理效果(基于给出的样例数据)

POS    APLICAÇÃO                                       NOMECLATURA     UOM
0  340.0  Trens - ERJ145                                  PLATE, INSTRUCTION  Unidade
1  773.0  Trens - ERJ145  PLACARD (O P/N- 2309- 2036-501 NÃO SUBSTITUI O P/N- PNE104003-027)  Unidade
2  795.0  Trens - ERJ145                                               BOLT    Cada
3  771.0  Trens - ERJ145                                          NAMEPLATE    Cada
4  610.0  Trens - ERJ145                                        RSA SCRAPER    Cada
5  425.0  Trens - ERJ145                      UPPER SECONDARY STRUT ASSEMBLY    Cada
6  336.0  Trens - ERJ145                                             SPRING    Cada
7  408.0  Trens - ERJ145                                    BEARING, SEALED    Cada

注意:如果列是数值类型,不要使用文本拼接逻辑,在agg中配置为取组内第一个值即可,避免数值被错误转换为拼接字符串。

内容的提问来源于stack exchange,提问作者Vinicius Kimura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:48:33