如何从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
相关产品推荐
相关产品推荐

