如何在Pandas中合并重复行,补全信息并获取最完整数据?
实现分组内重复数据补全,生成所有可能的完整信息组合
针对你提供的包含重复分组的Pandas DataFrame,要补全生成所有可能的完整信息组合,核心思路是为每个id分组生成一条包含该分组所有非空信息的完整行,再将完整行与原始数据合并去重,即可得到目标结果。
原始数据
import pandas as pd import numpy as np d = {'id': [1,1,1,2,2,3], 'col1': [25,np.NaN,25,3,np.NaN,1], 'col2':[np.NaN,'rrt',np.NaN,np.NaN,'sdf',np.NaN], 'col3':[300,300,np.NaN,500,500,600]} df = pd.DataFrame(data=d)
实现代码
# 定义函数:为每个分组生成完整行 def generate_full_row(group): # 对每一列,取分组内非空的唯一值;若无非空值则保留NaN full_row = group.apply(lambda col: col.dropna().unique()[0] if col.notna().any() else np.nan) return pd.DataFrame([full_row]) # 按id分组生成所有完整行 full_rows = df.groupby('id', group_keys=False).apply(generate_full_row) # 合并原始数据与完整行,去重后按指定顺序排序 combined = pd.concat([df, full_rows]).drop_duplicates() # 添加标记,确保每个id下完整行排在最前面 def is_full_row(row): group = df[df['id'] == row['id']] check = [] for col in ['col1', 'col2', 'col3']: if group[col].notna().any(): check.append(row[col] == group[col].dropna().unique()[0]) else: check.append(pd.isna(row[col])) return all(check) combined['is_full'] = combined.apply(is_full_row, axis=1) result = combined.sort_values(['id', 'is_full'], ascending=[True, False]) \ .drop('is_full', axis=1) \ .reset_index(drop=True) print(result)
输出结果
id col1 col2 col3 0 1 25.0 rrt 300.0 1 1 25.0 NaN 300.0 2 1 NaN rrt 300.0 3 1 25.0 NaN NaN 4 2 3.0 sdf 500.0 5 2 3.0 NaN 500.0 6 2 NaN sdf 500.0 7 3 1.0 NaN 600.0
逻辑说明
- 生成完整行:对每个
id分组,提取每一列的非空唯一值(分组内同一列的非空值无冲突),拼接成一条包含该分组所有有效信息的完整行。 - 合并去重:将完整行与原始数据合并,去除重复行,避免冗余。
- 排序调整:通过标记完整行,确保每个分组下完整行优先展示,其余行保留原始顺序。
内容的提问来源于stack exchange,提问作者Andres Perez
相关产品推荐
相关产品推荐

