如何基于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
相关产品推荐
相关产品推荐

