Home > Mobile >  How to assign a value to a row according to a column name using a list of dicts
How to assign a value to a row according to a column name using a list of dicts

Time:01-21

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 kindkey and namevalue.

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 namekey value of the kindkey 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  
  • Related