Eu tenho um DataFrame Polars contendo uma coluna com strings representando exposições 'esparsas' do setor, assim:
pl.DataFrame(
[
pl.Series("sector_exposure", [
'Technology=0.207;Financials=0.090;Health Care=0.084;Consumer Discretionary=0.069',
'Financials=0.250;Health Care=0.200;Consumer Staples=0.150;Industrials=0.400'
], dtype=pl.String),
]
)
exposição_do setor |
---|
Tecnologia=0,207;Finanças=0,090;Cuidados de saúde=0,084;Consumidor discricionário=0,069 |
Finanças = 0,250; Cuidados de saúde = 0,200; Produtos básicos de consumo = 0,150; Industriais = 0,400 |
Quero "descompactar" essa string em novas colunas para cada setor (por exemplo, Tecnologia, Finanças, Saúde) com valores associados ou uma estrutura polar com nomes de setores como campos e valores de exposição.
Estou procurando uma solução mais eficiente usando apenas expressões polares, sem recorrer a loops Python (ou funções mapeadas em python). Alguém pode fornecer orientação sobre como fazer isso?
Foi isso que descobri até agora - que funciona na produção da estrutura desejada, mas é um pouco lento.
(
df["sector_exposure"]
.str
.split(";")
.map_elements(lambda x: {entry.split('=')[0]: float(entry.split('=')[1]) for entry in x},
skip_nulls=True,
)
)
Obrigado!
Existem potencialmente duas maneiras de fazer isso em que consigo pensar.
Extrato Regex
Neste estamos contando com todos os números sendo decimais (você pode ajustar o regex para contornar isso um pouco) e todos os setores sendo pré-especificados no gerador dentro
with_columns
Dividir e girar
Neste você faz uma “rodada” de divisão no ponto e vírgula e depois explode. Então você divide novamente em igualdade, mas transforma isso em uma estrutura que você desaninha. A partir daí você dinamiza os setores até colunas.
Se os setores existissem na mesma ordem, você poderia usar
str.extract_groups
, mas com ordens variadas, não acho que funcione.Como foi mencionado em outro comentário, você pode realizar algumas substituições para tratar esses valores como
json
. Isso ajudará se você não tiver uma lista de todos os campos possíveis com antecedência: