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

