如何从Pandas含对象列表的列提取名称列表生成新DataFrame?
Pandas提取嵌套JSON字符串中的名称列表的最优实现
针对你的需求,有两种高效的实现方式,比单独写自定义函数更简洁且性能更优:
方法一:简洁快速的列表推导式(适合小数据量)
利用ast.literal_eval安全解析字符串格式的嵌套数据,再通过列表推导式提取名称:
import ast import pandas as pd # 原始DataFrame df = pd.DataFrame({'ID': [1], 'Data': ["[{'id':102, 'name': 'A'}, {'id':103, 'name': 'B'}, {'id':104, 'name': 'C'}]"]}) # 1. 将字符串格式的列表解析为Python对象 df['Data'] = df['Data'].apply(ast.literal_eval) # 2. 提取每个字典中的name字段组成列表 df['names'] = df['Data'].apply(lambda x: [d['name'] for d in x]) # 3. 保留需要的列 df = df[['ID', 'names']]
方法二:矢量化操作(适合大数据量)
用Pandas的矢量化方法展开嵌套数据再聚合,避免逐行apply的性能损耗:
import ast import pandas as pd # 原始DataFrame df = pd.DataFrame({'ID': [1], 'Data': ["[{'id':102, 'name': 'A'}, {'id':103, 'name': 'B'}, {'id':104, 'name': 'C'}]"]}) # 解析字符串为Python列表 df['Data'] = df['Data'].apply(ast.literal_eval) # 展开嵌套的列表数据 exploded_df = df.explode('Data') # 解析字典为结构化数据 normalized_df = pd.json_normalize(exploded_df['Data']) # 按ID分组,将name聚合为列表 result = exploded_df[['ID']].join(normalized_df).groupby('ID')['name'].agg(list).reset_index() result.columns = ['ID', 'names']
关键说明
- 优先用
ast.literal_eval而非eval:前者能安全处理不可信的字符串数据,避免执行恶意代码。 - 大数据量选方法二:
explode、json_normalize和groupby都是Pandas优化后的矢量化操作,比逐行apply快得多。
内容的提问来源于stack exchange,提问作者James Cooke
相关产品推荐
相关产品推荐

