Pandas如何合并DataFrame中相同url的行并保留无url数据
Pandas 同URL行合并(保留空URL独立行)方案
问题描述
处理需求为合并DataFrame中url字段取值相同的行,原始数据共5列:url、col1、col2、col3、col4,样例数据如下:
- url=aaa:第一行col2=xx、col3=yy,其余列空;第三行col1=ee,其余列空
- url=bbb:第二行col1=zz,其余列空
- url为空:第四行col4=AA,其余列空
合并规则: - 非空URL的同值行合并,各列取非空值,最终aaa行结果为col1=ee、col2=xx、col3=yy、col4为空
- 非空URL无重复的行(如bbb行)直接保留
- 空URL行不参与合并,完整保留
已踩坑:直接使用
groupby('url')会丢失空URL行;使用inner merge做自连接合并会出现行数异常倍增的问题。
实现逻辑
采用拆分-聚合-拼接的流程处理,从根源上避免上述两个问题:
- 将原始数据拆为两个独立子集:
url非空子集、url为空子集 - 仅对
url非空子集按url分组,聚合时每列取组内第一个非空值,完成同URL行合并 - 将聚合后的非空URL结果、原封不动的空URL子集做行拼接,重置索引得到最终结果
可运行代码
import pandas as pd import numpy as np # 构造样例原始数据 df = pd.DataFrame([ {"url": "aaa", "col1": np.nan, "col2": "xx", "col3": "yy", "col4": np.nan}, {"url": "bbb", "col1": "zz", "col2": np.nan, "col3": np.nan, "col4": np.nan}, {"url": "aaa", "col1": "ee", "col2": np.nan, "col3": np.nan, "col4": np.nan}, {"url": np.nan, "col1": np.nan, "col2": np.nan, "col3": np.nan, "col4": "AA"} ]) # 拆分数据集 non_empty_url_part = df[df["url"].notna()] empty_url_part = df[df["url"].isna()] # 同URL分组合并,取每列第一个非空值 merged_non_empty = non_empty_url_part.groupby("url", as_index=False).first() # 拼接得到最终结果 final_df = pd.concat([merged_non_empty, empty_url_part], ignore_index=True)
效果说明
执行代码后得到的final_df完全匹配预期结果:
- 两条url为aaa的行正确合并,所有非空字段无丢失
- url为bbb的单行数据完整保留
- 空URL、col4=AA的行未参与合并,原样保留
- 无数据丢失、行数异常倍增问题
补充:如果同URL的同一列存在多个非空值,可按需调整聚合函数:需要取最后一个非空值将.first()替换为.last()即可;需要将多个非空值拼接为字符串可传入自定义聚合函数。
内容的提问来源于stack exchange,提问作者PaulFaguet
相关产品推荐
相关产品推荐

