Tenho um conjunto de dados do qual estou tentando remover entradas duplicadas. O lazyframe com o qual estou trabalhando é estruturado assim:
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 │
└──────┴────────────┴──────────────────┴───────┘
""")
Quero remover entradas que tenham o mesmo id
, mas na verdade existem casos diferentes:
- As duplicatas têm o mesmo
type
(por exemplo, 1001): mantenha a primeira. - As duplicatas têm uma diferença
type
: descarta aquelas com uma string vazia ("") como tipo e, em seguida, mantém apenas as entradas que respeitam os seguintes pares detype
etype2
:
dict_df = pl.DataFrame({
"type": ['journal article', 'book chapter', 'book chapter'],
"type2": [35, 41, 42]
})
Saída esperada
identificação[i64] | título[str] | tipo[str] | tipo2[i64] |
---|---|---|---|
1001 | Pesquisa A | artigo de jornal | 35 |
1002 | Pesquisa B | capítulo de livro | 41 |
1003 | Pesquisa C | artigo de jornal | 35 |
1004 | Pesquisa D | artigo de conferência | 42 |
- 1001: mesmo tipo, mantenha o primeiro
- 1002: tipo diferente, mantenha a primeira ocorrência das entradas com o par {'book chapter': 41}
- 1003: tipo diferente, descarte as entradas com um tipo vazio e mantenha a primeira ocorrência
- 1004: não é uma duplicata
Tentei muitas coisas, principalmente usando a expressão pl.when(), mas não consigo descobrir uma maneira de filtrar os grupos.
(
df
.sort('type', descending=True)
.group_by("id")
.agg([
pl.when(pl.col("type").n_unique() > 1)
.then( ... )
.otherwise(pl.all().first())
])
)