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

