You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:15:59