Como você obtém uma group_id
coluna como esta, agrupando por colunas col1
e col2
?
col1 | col2 | id_do_grupo |
---|---|---|
UM | Z | 1 |
UM | E | 2 |
UM | Z | 1 |
B | Z | 3 |
com base em tal DataFrame:
df = pl.DataFrame({
'col1': ['A', 'A', 'A', 'B'],
'col2': ['Z', 'Y', 'Z', 'Z']}
)
Em outras palavras, estou procurando polares equivalentes a R data.table .GRP
( df[, group_id:=.GRP, by = .(col1, col2)]
). Obrigado!
Contexto: Quero construir um ID de evento porque, em meus dados, tenho muitas linhas detalhadas para um evento. Depois que o ID do evento for criado, usarei-o para executar várias operações de janela. Prefiro ter esse ID de evento em vez de manter uma lista de variáveis de agrupamento.
Se você não se importa com "primeira ocorrência tem classificação mais baixa", então você pode simplesmente
rank
combinar as colunascol1
ecol2
.pl.struct()
para criar uma coluna decol1
,col2
.pl.Expr.rank()
para atribuir classificação às linhas.Caso contrário, será um pouco mais complicado - você pode criar um índice para rastrear a ordem atual das linhas e então atribuir uma classificação com base nesse índice.
pl.DataFrame.with_row_index()
para criar um índice/número de linha.pl.Expr.min()
epl.Expr.over()
para obter o índice mínimo dentro decol
,col2
.pl.Expr.rank()
para "comprimir" esse mínimo em uma classificação densa.Uma maneira de fazer isso seria obter uma lista de combinações únicas de
col1
ecol2
e com um índice de linha inteiro. Essa seria a coluna de agrupamento que você está procurando.Por exemplo:
A junção emparelha cada linha com a linha apropriada
unique_pairs
e adiciona as outras colunas dessa linha (apenasgroup
neste caso) ao resultado.Isso pode resultar em uma numeração diferente. Se você precisar que a numeração siga a ordem dos dados originais, como no seu exemplo, você pode alterá-la para:
Agora, eles
unique_pairs
terão uma numeração de pares exclusivos que corresponde à ordem em que aparecem pela primeira vez, emdf
.Saída:
No entanto, sua pergunta me faz pensar se esse é um Problema XY . Por que exatamente você precisa desse agrupamento? Porque se o agrupamento for gerado apenas para executar operações de grupo mais tarde, você pode simplesmente usar a funcionalidade de agrupamento do Polars.
Por exemplo:
Resultados em: