我有一个数据集,想从中删除重复的条目。我使用的 lazyframe 结构如下:
df = pl.from_repr("""
┌──────┬────────────┬──────────────────┬───────┐
│ id ┆ title ┆ type ┆ type2 │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ i64 │
╞══════╪════════════╪══════════════════╪═══════╡
│ 1001 ┆ Research A ┆ journal article ┆ 35 │
│ 1002 ┆ Research B ┆ book chapter ┆ 41 │
│ 1003 ┆ Research C ┆ journal article ┆ 35 │
│ 1004 ┆ Research D ┆ conference paper ┆ 42 │
│ 1001 ┆ Research E ┆ journal article ┆ 35 │
│ 1002 ┆ Research F ┆ journal article ┆ 41 │
│ 1003 ┆ Research G ┆ ┆ 41 │
│ 1002 ┆ Research I ┆ book chapter ┆ 41 │
│ 1003 ┆ Research J ┆ journal article ┆ 35 │
└──────┴────────────┴──────────────────┴───────┘
""")
我想删除具有相同的条目id
,但实际上存在不同的情况:
- 重复项具有相同的内容
type
(例如 1001):保留第一个。 - 重复项具有不同的
type
:丢弃以空字符串(“”)作为类型的重复项,然后仅保留符合以下type
和对的条目type2
:
dict_df = pl.DataFrame({
"type": ['journal article', 'book chapter', 'book chapter'],
"type2": [35, 41, 42]
})
预期输出
id[i64] | 标题[字符串] | 类型[str] | 类型2[i64] |
---|---|---|---|
1001 | 研究A | 期刊文章 | 三十五 |
1002 | 研究B | 书章节 | 41 |
1003 | 研究C | 期刊文章 | 三十五 |
1004 | 研究方向 | 会议论文 | 四十二 |
- 1001:相同类型,保留第一个
- 1002:不同类型,保留第一次出现的带有 {'book chapter': 41} 的条目
- 1003:不同类型,丢弃类型为空的条目并保留第一个匹配项
- 1004:不是重复的
我尝试了很多方法,主要是使用 pl.when() 表达式,但我无法找到过滤组的方法。
(
df
.sort('type', descending=True)
.group_by("id")
.agg([
pl.when(pl.col("type").n_unique() > 1)
.then( ... )
.otherwise(pl.all().first())
])
)
您也许可以在
GroupBy
上下文中应用您的逻辑,但您也可以先预先过滤 DataFrame,这样您就只拥有您想要保留的行: