在Pandas中基于其他列值去重,保留name列值为foo的记录
优化方案说明
你的核心需求是移除duplicates列的重复项,仅保留name为"foo"的记录。现有代码存在不必要的数据修改和冗余操作,以下是更简洁高效的优化方案:
方案一:先筛选再去重(最简洁)
直接先筛选出name等于"foo"的记录,再对duplicates列去重,完全匹配你的需求:
import pandas as pd df = pd.DataFrame( {"name": ["foo", "bar", "foo", "baz"], "duplicates": ["qux", "qux", "fred", "fred"]} ) # 先筛选name为foo的记录,再去除duplicates列的重复项 result = df[df["name"] == "foo"].drop_duplicates("duplicates")
执行后结果:
| name | duplicates |
|---|---|
| foo | qux |
| foo | fred |
方案二:按组优先保留foo记录(更灵活)
如果你的需求是:对每个重复的duplicates组,优先保留name为"foo"的记录(若存在),无foo则丢弃整组,可以用分组实现:
import pandas as pd df = pd.DataFrame( {"name": ["foo", "bar", "foo", "baz"], "duplicates": ["qux", "qux", "fred", "fred"]} ) # 按duplicates分组,优先选择foo记录,无则丢弃 result = df.groupby("duplicates").apply( lambda x: x[x["name"] == "foo"].head(1) if (x["name"] == "foo").any() else pd.DataFrame() ).reset_index(drop=True)
现有代码的问题点
- 不必要地将
name列映射为"a",破坏了原始数据的完整性 - 使用
inplace=True会修改原DataFrame,容易引发副作用,更推荐赋值新变量 - 排序操作冗余,直接针对需求筛选/分组即可达到目的
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

