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

如何基于ID合并DataFrame重复行并补全缺失数据?

基于ID合并DataFrame重复行(填充缺失值)

我们可以通过Pandas的分组聚合功能实现需求:按id列分组,将同一ID下的行合并,用非缺失值填充对应列的空值,最终每个ID仅保留一行完整数据。

步骤1:构造示例DataFrame

先将你提供的表格转换为Pandas可处理的格式(空值用NaN表示):

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': ['ab1', 'cd2', 'ef3', 'ab1', 'ef3', 'cd2', 'cd2'],
    'name': ['maria', 'jordan', 'canela', 'maria', 'canela', 'jordan', 'jordan'],
    'snack': ['pretzel', np.nan, np.nan, np.nan, 'chips', np.nan, 'goldfish'],
    'treat': [np.nan, np.nan, 'cookie', 'brownie', np.nan, np.nan, np.nan],
    'age': [20, np.nan, np.nan, 20, np.nan, np.nan, 25],
    'year': [np.nan, 1998, np.nan, 2012, np.nan, 1998, np.nan]
})

步骤2:核心合并逻辑

按id分组后,对每一列提取第一个非缺失值(同一ID下该列的有效值唯一):

# 分组聚合,保留非缺失值
merged_df = df.groupby('id', as_index=False).agg(
    lambda x: x.dropna().iloc[0] if not x.dropna().empty else np.nan
)

步骤3:可选格式调整

如果需要将NaN转为空字符串,贴合你给出的期望格式:

merged_df = merged_df.replace(np.nan, '')

最终结果

运行后得到的merged_df与你期望的一致:

id    name     snack    treat age  year
0  ab1   maria  pretzel  brownie  20  2012
1  cd2  jordan  goldfish           25  1998
2  ef3  canela     chips   cookie       

扩展说明

如果同一ID下某一列存在多个不同的非缺失值(比如两个不同的零食),可以修改聚合函数合并所有值:

# 用逗号分隔合并同一列的所有非重复有效值
merged_df = df.groupby('id', as_index=False).agg(
    lambda x: ', '.join(x.dropna().unique()) if not x.dropna().empty else ''
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:54:55