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

如何合并DataFrame,将同一标识的多行非空值整合为单行?

如何合并DataFrame,将同一标识的多行非空值整合为单行?

嘿,这个需求太常见啦,我给你分享几个简单有效的解决办法,轻松把分散在多行的非空值合并成单行!

首先咱们明确核心思路:你的数据里,同一id和email对应的多行数据,每个字段(firstname、lastname这些)只有一个非空值,其他都是空的。那我们只需要按id和email分组,然后把每组里每个字段的非空值提取出来就行。

方法一:用groupby + first()(最简洁)

这个方法利用了pandas的first()函数会自动忽略空值(NaN)、取每组第一个非空元素的特性,完美适配你的场景。

先还原你的示例数据(如果你的空值是空字符串,记得先转成NaN):

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'id': ['2be858a0458faa569d3d']*3,
    'email': ['user_a@gmail.com']*3,
    'firstname': ['', 'Firstname', 'Firstname'],
    'lastname': ['Lastname', '', ''],
    'salutation': ['', '', 'Mr']
})

# 将空字符串转为NaN,方便后续处理
df = df.replace('', np.nan)

然后执行合并操作:

# 按id和email分组,合并为单行
df_consolidated = df.groupby(['id', 'email'], as_index=False).first()

运行后得到的df_consolidated就是你想要的结果:

idemailfirstnamelastnamesalutation
2be858a0458faa569d3duser_a@gmail.comFirstnameLastnameMr

方法二:自定义聚合函数(更灵活)

如果你的场景更复杂(比如某个字段可能有多个非空值需要处理),可以用自定义聚合函数提取非空值:

df_consolidated = df.groupby(['id', 'email'], as_index=False).agg(lambda x: x.dropna().iloc[0])

这个逻辑是先去掉每个分组里的空值,再取第一个元素,效果和方法一一致,但你可以根据需求修改逻辑(比如改成取最后一个、拼接多个值等)。

补充说明

如果你的原始数据里的空值本来就是None或者NaN,可以跳过replace('', np.nan)这一步,直接用上面的分组方法即可。

备注:内容来源于stack exchange,提问作者Robert_the_Python

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:49:13