A column in a dataframe has a list of dictionaries like the first 5 rows of this column:
array(['[{"id": 709377, "kind": "diretoria", "name": "jurídico", "category": "filter"}, {"id": 727580, "kind": "categoria_do_cargo", "name": "empregado(a)", "category": "filter"}, {"id": 341893, "kind": "gerência", "name": "relações_institucionais", "category": "filter"}, {"id": 342200, "kind": "cargo", "name": "analista_de_relações_institucionais_sr", "category": "filter"}, {"id": 342552, "kind": "geração", "name": "geração_x", "category": "filter"}, {"id": 700038, "kind": "idade", "name": "53", "category": "filter"}, {"id": 342659, "kind": "expectancy", "name": "custom_entre_1_e_3_anos", "category": "response"}, {"id": 1023218, "kind": "tempo_de_empresa", "name": "8-_mais_de_20_anos", "category": "filter"}, {"id": 699799, "kind": "n3", "name": "reli", "category": "filter"}]',
'[{"id": 342658, "kind": "expectancy", "name": "custom_mais_de_5_anos", "category": "response"}, {"id": 709379, "kind": "diretoria", "name": "financeiro", "category": "filter"}, {"id": 727580, "kind": "categoria_do_cargo", "name": "empregado(a)", "category": "filter"}, {"id": 341788, "kind": "gerência", "name": "compras", "category": "filter"}, {"id": 342237, "kind": "cargo", "name": "comprador_sr", "category": "filter"}, {"id": 342554, "kind": "geração", "name": "geração_y", "category": "filter"}, {"id": 700055, "kind": "idade", "name": "37", "category": "filter"}, {"id": 1023221, "kind": "tempo_de_empresa", "name": "4-_entre_3_e_5_anos", "category": "filter"}, {"id": 699749, "kind": "n3", "name": "cind", "category": "filter"}]',
'[{"id": 342659, "kind": "expectancy", "name": "custom_entre_1_e_3_anos", "category": "response"}, {"id": 727580, "kind": "categoria_do_cargo", "name": "empregado(a)", "category": "filter"}, {"id": 341753, "kind": "diretoria", "name": "operações,_logística_e_sourcing", "category": "filter"}, {"id": 341847, "kind": "gerência", "name": "operações", "category": "filter"}, {"id": 342163, "kind": "cargo", "name": "técnico_de_operações_sr", "category": "filter"}, {"id": 342552, "kind": "geração", "name": "geração_x", "category": "filter"}, {"id": 700038, "kind": "idade", "name": "53", "category": "filter"}, {"id": 1023218, "kind": "tempo_de_empresa", "name": "8-_mais_de_20_anos", "category": "filter"}, {"id": 699732, "kind": "n3", "name": "opav", "category": "filter"}]',
'[{"id": 342659, "kind": "expectancy", "name": "custom_entre_1_e_3_anos", "category": "response"}, {"id": 709383, "kind": "gerência", "name": "atração,_trein_e_do,_bps", "category": "filter"}, {"id": 727580, "kind": "categoria_do_cargo", "name": "empregado(a)", "category": "filter"}, {"id": 341751, "kind": "diretoria", "name": "gente_e_gestão", "category": "filter"}, {"id": 342315, "kind": "cargo", "name": "parceiro_de_negócios_sr", "category": "filter"}, {"id": 342554, "kind": "geração", "name": "geração_y", "category": "filter"}, {"id": 700057, "kind": "idade", "name": "36", "category": "filter"}, {"id": 1023215, "kind": "tempo_de_empresa", "name": "3-_entre_1_e_3_anos", "category": "filter"}, {"id": 699715, "kind": "n3", "name": "adbp", "category": "filter"}]',
'[{"id": 342658, "kind": "expectancy", "name": "custom_mais_de_5_anos", "category": "response"}, {"id": 727580, "kind": "categoria_do_cargo", "name": "empregado(a)", "category": "filter"}, {"id": 341753, "kind": "diretoria", "name": "operações,_logística_e_sourcing", "category": "filter"}, {"id": 341847, "kind": "gerência", "name": "operações", "category": "filter"}, {"id": 342376, "kind": "cargo", "name": "operador", "category": "filter"}, {"id": 342552, "kind": "geração", "name": "geração_x", "category": "filter"}, {"id": 700037, "kind": "idade", "name": "48", "category": "filter"}, {"id": 1023215, "kind": "tempo_de_empresa", "name": "3-_entre_1_e_3_anos", "category": "filter"}, {"id": 699668, "kind": "n3", "name": "opns", "category": "filter"}]'],
dtype=object)
The list has 9 dicts and every dict has a kind
key and name
value.
What I want to do is to explode this list of dict for every row in my dataframe in a way that the new dataframe will have 9 new columns ans the columns_name should be the kind key.
Like this:
'expectancy' 'categoria_do_cargo' 'diretoria' 'gerência' 'cargo' 'geração' 'idade' 'tempo_de_empresa' 'n3'
these columns names comes from the kind key
of the dicts.
Now the trick part:
I want for every row, to assign to each of these 9 columns the name
key value of the kind
key that is equal to that column name.
pd.DataFrame({'expectancy':['custom_entre_1_e_3_anos','custom_mais_de_5_anos'], 'categoria_do_cargo':['empregado(a)','empregado(a)'],'diretoria':['juridico','financeiro'], 'gerência':['relações_institucionais','compras'],'cargo':['analista_de_relações_institucionais_sr','comprador_sr'],'geração':['geração_x','geração_y'],'idade':[53,37],'tempo_de_empresa':['8-_mais_de_20_anos','4-_entre_3_e_5_anos'],'n3':['reli','cind']})
How can I do this?
CodePudding user response:
You have a list of strings that you need to convert as python data structure before reshape the dataframe:
>>> (df['col'].apply(ast.literal_eval).explode()
.apply(pd.Series).reset_index()
.pivot(index='index', columns='kind', values='name')
.rename_axis(index=None, columns=None))
cargo categoria_do_cargo diretoria expectancy geração gerência idade n3 tempo_de_empresa
0 analista_de_relações_institucionais_sr empregado(a) jurídico custom_entre_1_e_3_anos geração_x relações_institucionais 53 reli 8-_mais_de_20_anos
1 comprador_sr empregado(a) financeiro custom_mais_de_5_anos geração_y compras 37 cind 4-_entre_3_e_5_anos
2 técnico_de_operações_sr empregado(a) operações,_logística_e_sourcing custom_entre_1_e_3_anos geração_x operações 53 opav 8-_mais_de_20_anos
3 parceiro_de_negócios_sr empregado(a) gente_e_gestão custom_entre_1_e_3_anos geração_y atração,_trein_e_do,_bps 36 adbp 3-_entre_1_e_3_anos
4 operador empregado(a) operações,_logística_e_sourcing custom_mais_de_5_anos geração_x operações 48 opns 3-_entre_1_e_3_anos
CodePudding user response:
A much shorter approach is utilizing operator.itemgetter
function (to fetch dictionary values by keys) and constructing a new dataframe from a list of dicts:
import json
from operator import itemgetter
...
df_new = pd.DataFrame([dict([itemgetter('kind', 'name')(d) for d in lst])
for lst in df[0].apply(json.loads)])
diretoria categoria_do_cargo \
0 jurídico empregado(a)
1 financeiro empregado(a)
2 operações,_logística_e_sourcing empregado(a)
3 gente_e_gestão empregado(a)
4 operações,_logística_e_sourcing empregado(a)
gerência cargo \
0 relações_institucionais analista_de_relações_institucionais_sr
1 compras comprador_sr
2 operações técnico_de_operações_sr
3 atração,_trein_e_do,_bps parceiro_de_negócios_sr
4 operações operador
geração idade expectancy tempo_de_empresa n3
0 geração_x 53 custom_entre_1_e_3_anos 8-_mais_de_20_anos reli
1 geração_y 37 custom_mais_de_5_anos 4-_entre_3_e_5_anos cind
2 geração_x 53 custom_entre_1_e_3_anos 8-_mais_de_20_anos opav
3 geração_y 36 custom_entre_1_e_3_anos 3-_entre_1_e_3_anos adbp
4 geração_x 48 custom_mais_de_5_anos 3-_entre_1_e_3_anos opns