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

如何在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

逻辑说明

  1. 生成完整行:对每个id分组,提取每一列的非空唯一值(分组内同一列的非空值无冲突),拼接成一条包含该分组所有有效信息的完整行。
  2. 合并去重:将完整行与原始数据合并,去除重复行,避免冗余。
  3. 排序调整:通过标记完整行,确保每个分组下完整行优先展示,其余行保留原始顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:25:22