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

