如何基于指定列对Pandas DataFrame按Name列分组去重?
Pandas分组去重实现指引
核心思路
按Name列分组后,提取每组内各列的唯一非空有效值——你的原始数据中,同一Name分组下的有效数据分散在不同行,其余行对应列均为空,只需取每组各列第一个非空值(或唯一非空值)即可得到目标结果。
代码实现
假设你的DataFrame变量名为df,以下是两种可行方案:
方案1:简洁高效(推荐)
利用groupby结合first()方法,自动跳过空值(需先将空字符串转为NaN):
import pandas as pd # 先将原始数据中的空字符串替换为Pandas可识别的NaN df = df.replace('', pd.NA) # 按Name分组,取每组各列第一个非空有效值 result = df.groupby('Name', as_index=False).first()
方案2:精准控制(适用于复杂场景)
如果需要明确指定每列的处理逻辑(比如确保只取唯一非空值),可以用agg自定义聚合函数:
import pandas as pd df = df.replace('', pd.NA) result = df.groupby('Name', as_index=False).agg( NoOfTrans=('NoOfTrans', lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA), Avg_pass_time=('Avg_pass_time', lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA), Cons.Error=('Cons.Error', lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA), RunCounts=('RunCounts', lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA) )
结果验证
执行上述代码后,result的输出将完全符合你的需求:
Name NoOfTrans Avg_pass_time Cons.Error RunCounts Jan 0 Failed:abcd 4 May 2 1200 Failed:abcFailed:cde 5
内容的提问来源于stack exchange,提问作者trainset
相关产品推荐
相关产品推荐

