如何从dataframe行中的字典中提取值

2024-06-26 18:00:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了几种方法从adress列中提取数据并将其转换为新列

 df.head(3)

       name    Adress

0      Joan   {'city': 'Rio', 'district': 'Leme'}

1      Joan   {'city': 'Sao Paulo', 'district': 'Bras'}

2   Vincent   {'city': 'Recife', 'district': 'Caxanga'}

我使用了所有这些方法,但都不起作用

#reduce(set.union, df_apresentar['address'], set())

#set(df_apresentar['address'].values())

#values = set(df_apresentar['address'][0])

#df_apresentar['endereco'] = df_apresentar.address.apply (lambda x: x.get ('address'))

#df_apresentar['endereco'] = df_apresentar.address.apply (lambda x: x.get ('value'))

我需要这样的东西:

df.head(3)

       name    Adress  city     district

0      Joan   {}       Rio      Leme

1      Joan   {}      Friburgo  Bras

2   Vincent   {}      Recife    Caxanga

Tags: 方法namecitydfaddressheadsetvincent
3条回答

您还可以使用Dataframe()方法和tolist()方法:

newdf=pd.DataFrame(data=df['Adress'].tolist())

最后使用concat()方法:

newdf=pd.concat((df,newdf),axis=1)

现在,如果您打印newdf,您将获得:

    name      Adress                                        city        district
0   Joan      {'city': 'Rio', 'district': 'Leme'}           Rio         Leme
1   Joan      {'city': 'Sao Paulo', 'district': 'Bras'}     Sao Paulo   Bras
2   Vincent   {'city': 'Recife', 'district': 'Caxanga'}     Recife      Caxanga

如果需要,使用drop()方法:

newdf=newdf.drop(columns=['Adress'])

您可以使用apply(pd.Series)将地址列dict转换为它们自己的列,并将其与原始df连接起来:

address_df = df.pop("Address")
new_df = pd.concat([df, address_df.apply(pd.Series)], axis = 1)

      name       city district
0     Joan        Rio     Leme
1     Joan  Sao Paulo     Bras
2  Vincent     Recife  Caxamga

或者,作为一个细微的变化,使用join代替concat

new_df = df.drop("Address",axis=1).join(df.Address.apply(pd.Series))

您可以使用^{}将json/dict扩展为列,然后使用^{}连接回原始数据帧:

pd.concat([df.drop(columns='Adress'),  pd.json_normalize(df['Adress'])], axis=1) 


      name       city district
0     Joan        Rio     Leme
1     Joan  Sao Paulo     Bras
2  Vincent     Recife  Caxanga

请注意,使用pd.json_normalize()将json/dict扩展到列比使用.apply(pd.Series())进行扩展要高效得多

相关问题 更多 >