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
相关产品推荐
相关产品推荐

