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

DataFrame如何合并连续行 按ID分组拼接多条INFO为单个字符串

实现方法

核心逻辑是先给每条数据标记所属的实体分组,再按分组聚合取值、拼接Info字段,全程不会出现行号错位问题。

方法1:直接基于原始两列表格一次生成结果(推荐)

不需要提前单独提取ID、Name列,适配任意数量的Info条目,代码如下:

import pandas as pd

# 过滤掉作为分隔符的全空行
df = df_raw[~(df_raw["Column 1"].isna() & df_raw["Column 2"].isna())].reset_index(drop=True)

# 每遇到一个ID行,分组编号+1,同个实体的所有行共享同一个分组编号
df["group_id"] = (df["Column 1"] == "ID.").cumsum()

# 分组聚合提取目标字段
result = df.groupby("group_id").apply(
    lambda g: pd.Series({
        "ID.": g.loc[g["Column 1"] == "ID.", "Column 2"].iloc[0],
        "Name.": g.loc[g["Column 1"] == "Name.", "Column 2"].iloc[0],
        "Info.": ", ".join(g.loc[g["Column 1"] == "Info", "Column 2"])
    })
).reset_index(drop=True)
  • 拼接Info的分隔符可以按需替换,比如需要用换行、分号分隔,直接修改", "部分即可
  • 输出的result就是ID.、Name.、Info.三列结构,每个ID对应唯一一行,和目标表结构完全一致

方法2:适配已经提取好ID、Name列的场景

如果你已经生成了只存ID、Name的表df_id_name(每个ID一行),可以先单独聚合Info字段再做关联,避免重复处理:

# 预处理原始表生成分组标记
df = df_raw[~(df_raw["Column 1"].isna() & df_raw["Column 2"].isna())].reset_index(drop=True)
df["group_id"] = (df["Column 1"] == "ID.").cumsum()

# 生成分组和ID的映射关系
group_id_map = df.groupby("group_id").apply(
    lambda g: g.loc[g["Column 1"] == "ID.", "Column 2"].iloc[0]
).rename("ID.").reset_index()

# 聚合所有Info字段
info_agg = df[df["Column 1"] == "Info"]\
    .merge(group_id_map, on="group_id")\
    .groupby("ID.")["Column 2"]\
    .apply(lambda x: ", ".join(x))\
    .rename("Info.")\
    .reset_index()

# 和已有的ID、Name表左连接,得到最终结果
result = df_id_name.merge(info_agg, on="ID.", how="left")

注意:不要直接按行位置给Info匹配ID,一旦某个实体的Info数量变化,会直接导致后续所有行匹配错位,用分组标记的方式稳定性最高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:39:14