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

如何在Python中使用groupby去除分组后列表中的重复项?

Pandas Groupby后去除列表重复值的解决方案

嘿,针对你的问题,set()确实能用来去重,但直接用在当前场景里可能会踩坑——尤其是处理nan的时候,因为Python里nan不等于自身,普通的set()会把多个nan当成不同的值保留,这显然不是你想要的。另外,我们可以根据你的具体需求选择更合适的方法:

情况1:对每个分组内的每一行列值去重

看你示例里的us_7493586,是把单一行里重复的Includes Handle去掉,只保留一个和nan。这种场景下,我们可以先给每行做去重处理,再按ID分组收集:

import pandas as pd
df = pd.read_csv("Test.csv")

def deduplicate_row(row):
    seen = set()
    unique_vals = []
    for val in row:
        # 单独处理nan,避免因为nan != nan导致的重复保留
        if pd.isna(val):
            if val not in seen:
                unique_vals.append(val)
                seen.add(val)
        else:
            if val not in seen:
                unique_vals.append(val)
                seen.add(val)
    return unique_vals

# 先对每行的列值去重,再按ID分组转成列表
grouped = df.groupby('<ID>')['fb1','fb2','fb3'].apply(lambda x: x.apply(deduplicate_row, axis=1).tolist())

情况2:把整个分组的所有列值合并后去重

如果你的需求是把某个ID下所有行的fb1/fb2/fb3值全部合并成一个大列表,再去重,那用pd.unique()会更简洁高效——它专门为pandas数据设计,能正确识别nan,还能保留值的首次出现顺序:

import pandas as pd
df = pd.read_csv("Test.csv")

# 扁平化分组内的所有值,用pd.unique去重后转成列表
grouped = df.groupby('<ID>')['fb1','fb2','fb3'].apply(lambda x: list(pd.unique(x.values.flatten())))

这个方法处理你示例里的us_7493586时,会把该行的['Includes Handle', 'Includes Handle', nan]扁平化后转成['Includes Handle', nan],完美匹配你的期望结果。

为什么不用普通的set()?

普通set()有两个明显问题:

  • 无序:会打乱值原本的出现顺序;
  • nan处理错误:因为nan != nan,多个nan会被当成不同元素保留,不符合我们的去重逻辑。

而pd.unique()正好解决了这两个问题,是处理pandas数据去重的更优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:33:02