3
respostas

Manipulação de dataframe

Tenho um dataframe em que uma de suas colunas é preenchida com um dicionário. Gostaria de saber como posso fazer para que as o conteúdo desse dicionário se transforme em colunas do dataframe inicial.

Por exemplo:

df1= pd.DataFrame(data=[[1, {'A':5, 'B':2, 'C':8}, 3],[4, {'A':7, 'B':8, 'C':9}, 6], [7, {'A':4, 'B':5, 'C':6}, 9] ], columns= ['0', 'dic', '2'])

E eu gostaria de transformar em

df2 = pd.DataFrame(data=[[1, 5, 2, 8, 3],[4, 7, 8, 9, 6], [7, 4, 5, 6, 9] ], columns=  ['0', 'A', 'B', 'C', '2']) 
3 respostas

Olá, Roberta, tudo bem?

Essa pergunta é muito boa! hehehe

Existem algumas formas de conseguir atingir o resultado que você espera. Eu vou apresentar uma que é bem direta.

Como uma de nossas colunas possui um dicionário para cada linha, eu posso utilizar o código apply(pd.Series) na coluna df1['dic'] que aplica uma função transformando cada dicionário em um par coluna (com as chaves do dicionário) e linha (os valores correspondentes a cada chave). Esse processo é repetido para cada registro (linha) da coluna df1['dic'].

Assim, para conseguir esse efeito, o seu código pode ter o seguinte fluxo:

import pandas as pd

# Criando um df com uma das colunas com um dicionário
df1= pd.DataFrame(data=[[1, {'A':5, 'B':2, 'C':8}, 3],[4, {'A':7, 'B':8, 'C':9}, 6], [7, {'A':4, 'B':5, 'C':6}, 9] ], columns= ['0', 'dic', '2'])

# Aplicando uma função que transforma cada linha da coluna com o dicionário em um Panda Series
dic = df1['dic'].apply(pd.Series)

# Concatenando as colunas desejadas para o novo df1
df1_novo = pd.concat([df1['0'], dic, df1['2']], axis = 1)
df1_novo

Espero ter ajudado e qualquer dúvida é só chamar!

Forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Oi, Afonso! Obrigada pela resposta! Uma outra dúvida no assunto: e caso nem todos os dicionário possuíssem as mesmas chaves? por exemplo, se o segundo dicionário fosse {'A':7, 'C':8, 'D':9}, seria possível transformar em colunas do df tbm ?

Olá, Roberta!

Seria sim, mas nas combinações entre eles poderiam existir valores NaN. Por exemplo se em um caso tivesse {'A':7, 'B':8, 'D':9} e {'A':3, 'C':5, 'D':7} é muit provável que apareceria algo assim:

ABCD
78NaN9
3NaN57

Mas, no meu ponto de vista, o ideal é tratar essa coluna de dicionários individualmente antes de passar para o seu df, belezinha?

Bons estudos!