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

如何用Pandas去除DataFrame重复项并合并空缺列的值?

解决DataFrame按指定列去重并整合非空值的问题

核心思路

按目标列(A列)分组,将每个分组内分散在不同行的非空值整合到同一行,最终每个唯一的A值对应一行完整数据。

示例输入

先构造符合需求的示例DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': ['x', 'x', 'y', 'y', 'y'],
    'B': [1, np.nan, np.nan, 3, np.nan],
    'C': [np.nan, 2, 4, np.nan, np.nan],
    'D': [5, np.nan, np.nan, np.nan, 6],
    'E': [np.nan, np.nan, 7, np.nan, np.nan]
})

解决方案

根据不同业务场景,有以下几种动态实现方式:

场景1:每个分组的每列仅有一个非空值

直接提取该列的非空值,全空则保留NaN:

# 按A列分组,对每个列提取第一个非空值(无空值则保留NaN)
result = df.groupby('A', as_index=False).agg(
    lambda x: x.dropna().iloc[0] if not x.dropna().empty else np.nan
)

场景2:同一列同一分组存在多个非空值,需合并展示

将同一列的所有非空值去重后合并为字符串:

# 合并同一列的非空值为逗号分隔的字符串,自动去重
result = df.groupby('A', as_index=False).agg(
    lambda x: ', '.join(map(str, x.dropna().unique()))
)

场景3:分组内数据互补(不同行填充不同列非空值)

通过前后填充补全所有空值,再取分组内第一行作为完整数据:

# 对每个分组先向后填充、再向前填充,补全所有空值后取第一行
result = df.groupby('A').apply(
    lambda x: x.bfill().ffill().iloc[0]
).reset_index(drop=True)

动态特性说明

以上方法均无需手动指定B、C、D、E等列名,会自动处理除分组列(A列)外的所有列,完全适配任意列数的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:15:00