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

如何从DataFrame的字典列中提取字段添加为新列

解决方案:从DataFrame的字典列表字符串列提取字段生成新列

核心思路

先把存储为字符串的列表字典转换成可操作的Python对象,再提取字典中的键作为新列。以下是两种实用方法:


方法一:使用apply逐个提取(适合小数据集)

import pandas as pd
import ast

# 构造示例数据
data = {
    'attendanceDetails': [
        "[{'clockIn': '1669435507', 'clockOut': '1669468193'}]",
        "[{'clockIn': '1669521900', 'clockOut': '1669554599'}]",
        "[]"  # 模拟空列表情况
    ]
}
df = pd.DataFrame(data)

# 1. 将字符串解析为Python列表字典
df['attendanceDetails'] = df['attendanceDetails'].apply(ast.literal_eval)

# 2. 提取指定字段,处理空值避免报错
df['clockIn'] = df['attendanceDetails'].apply(lambda x: x[0]['clockIn'] if (x and len(x) > 0) else None)
df['clockOut'] = df['attendanceDetails'].apply(lambda x: x[0]['clockOut'] if (x and len(x) > 0) else None)

# 查看结果
print(df)

方法二:使用pd.json_normalize(适合大数据集,效率更高)

如果列表中可能包含多个字典,这种方法能自动展开所有字段,同时保留原数据的关联:

import pandas as pd
import ast

# 构造示例数据
data = {
    'id': [1, 2],
    'attendanceDetails': [
        "[{'clockIn': '1669435507', 'clockOut': '1669468193'}, {'clockIn': '1669608300', 'clockOut': '1669640999'}]",
        "[{'clockIn': '1669521900', 'clockOut': '1669554599'}]"
    ]
}
df = pd.DataFrame(data)

# 1. 解析字符串为列表字典
df['attendanceDetails'] = df['attendanceDetails'].apply(ast.literal_eval)

# 2. 展开列表中的字典并合并到原DataFrame
# explode将列表中的每个字典拆成单独一行,再用json_normalize提取字段
exploded_df = df.explode('attendanceDetails')
normalized_df = pd.json_normalize(exploded_df['attendanceDetails'])
result_df = pd.concat([exploded_df.drop('attendanceDetails', axis=1), normalized_df], axis=1)

# 查看结果
print(result_df)

注意事项

  • 若字符串格式不规范(比如单引号与双引号混用),可以先用str.replace("'", "\"")替换后,再用json.loads解析,但ast.literal_eval对单引号格式的支持更友好;
  • 如果列表中存在多个字典,方法二会将每个字典拆分为单独一行,若需聚合同一行的多个字典数据,可以结合groupby处理;
  • 务必处理空值场景,避免出现IndexError或KeyError。

内容的提问来源于stack exchange,提问作者Alonso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:02:00