如何合并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就是你想要的结果:
| id | firstname | lastname | salutation | |
|---|---|---|---|---|
| 2be858a0458faa569d3d | user_a@gmail.com | Firstname | Lastname | Mr |
方法二:自定义聚合函数(更灵活)
如果你的场景更复杂(比如某个字段可能有多个非空值需要处理),可以用自定义聚合函数提取非空值:
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
相关产品推荐
相关产品推荐

