python-3.x 如何使用字典列表根据列名为行赋值

vsdwdz23  于 2023-01-22  发布在  Python
关注(0)|答案(2)|浏览(165)

Dataframe 中的列具有字典列表,如该列的前5行:

'[{"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"}]'

该列表有9个dict,每个dict有一个kind键和name值。
我想要做的是,以这样一种方式为我的 Dataframe 中的每一行分解这个dict列表,即新的 Dataframe 将有9个新列,并且columns_name应该是种类键。
就像这样:

'expectancy'  'categoria_do_cargo'  'diretoria' 'gerência' 'cargo' 'geração' 'idade'  'tempo_de_empresa' 'n3'

这些列名来自于字典的kind key
现在的技巧部分:
对于每一行,我都要为这9列中的每一列分配与该列名相等的kind键的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']})

我该怎么做呢?

myzjeezk

myzjeezk1#

您有一个字符串列表,需要在重塑 Dataframe 之前将其转换为python数据结构:

>>> (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
htzpubme

htzpubme2#

一个更短的方法是利用operator.itemgetter函数(通过键获取字典值)并从字典列表中构造一个新的 Dataframe :

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

相关问题