如何从DataFrame字典列中提取指定键值生成独立列
问题根因
你第二个方法抛出的AttributeError: 'str' object has no attribute 'get'已经点明了核心问题:Details列存储的是JSON格式的字符串,不是原生字典对象,直接调用字典方法必然报错。你之前三个写法的具体错误:
- 写法1:
df['Details'].keys()取的是整个Details Series的行索引,取第一个值赋值给整列,所有行值完全相同,根本没有访问单元格内的存储内容 - 写法2:除了单元格是字符串无法调用get的问题,传入的参数
[0]是列表类型,就算内容是字典,也不存在名为[0]的键,逻辑本身错误 - 写法3:
df['Details'].get([0])是尝试从Series中取索引为[0]的元素,不是访问单元格内字典的键,所以返回全NaN
正确实现方案
方法1:易读通用写法
先把JSON字符串转为原生字典,再逐行提取字段即可:
import json # 把字符串格式的字典转为Python原生字典对象 df['Details'] = df['Details'].apply(json.loads) # 提取对应字段生成新列 df['Number'] = df['Details'].apply(lambda x: x['number']) df['Name'] = df['Details'].apply(lambda x: x['name']) # 不需要保留原Details列可以执行下行删除 # df.drop(columns=['Details'], inplace=True)
*如果不确定字段是否一定存在,可以把x['key']换成x.get('key', 默认值),避免KeyError。
方法2:高效简洁写法
用pd.json_normalize一次性把字典结构拆成独立列,再和原Date列拼接,性能比逐行apply更好:
import json import pandas as pd # 解析字符串为字典后直接平铺为多列 parsed_cols = pd.json_normalize(df['Details'].apply(json.loads)) # 重命名列后和原Date列拼接 df = pd.concat( [df[['Date']], parsed_cols.rename(columns={'number':'Number', 'name':'Name'})], axis=1 )
处理完成后的最终数据结构如下:
Date Number Name 0 6/14/2022 1 John 1 6/15/2022 2 Steve 2 6/16/2022 3 Mira 3 6/17/2022 17 John 4 6/18/2022 4 Larry 5 6/19/2022 33 Bob 6 6/20/2022 43 james 7 6/21/2022 112 Joe
补充说明:如果你读取数据时已经把Details列解析为原生字典(比如用pd.read_json读入的结构化数据),可以跳过
json.loads转换步骤,直接提取字段即可。
内容的提问来源于stack exchange,提问作者Slavisha84
相关产品推荐
相关产品推荐

