如何在Pandas DataFrame中将字典列表转换为值列表并新增列
解决方法:从Pandas字典列表列提取指定键值生成新列
这需求太常见啦,给你两种实用的解决办法,根据你的数据集大小灵活选择:
方法一:apply + 列表推导式(简单直观,适合小数据集)
先构造可直接测试的示例数据,然后一步生成新列:
import pandas as pd # 构造你的示例DataFrame data = { 'id': ['a1', 'a2', 'a3', 'a4'], 'list_dicts': [ [{'name':'cat'}, {'name':'dog'}], [{'name':'toy'}, {'name':'boy'}], [{'name':'jack'}, {'name':'jill'}, {'name':'sam'}], [{'name':'pig'}] ] } df = pd.DataFrame(data).set_index('id') # 核心代码:提取每个字典的'name'值组成新列表 df['list_from_dict'] = df['list_dicts'].apply(lambda x: [d['name'] for d in x])
运行后查看结果:
print(df)
输出会和你期望的完全一致:
list_dicts list_from_dict id a1 [{'name': 'cat'}, {'name': 'dog'}] ['cat', 'dog'] a2 [{'name': 'toy'}, {'name': 'boy'}] ['toy', 'boy'] a3 [{'name': 'jack'}, {'name': 'jill'}, {'name': 'sam'}] ['jack', 'jill', 'sam'] a4 [{'name': 'pig'}] ['pig']
这个方法逻辑直白:用apply遍历每行的字典列表,通过列表推导式把每个字典的name值提取出来,拼成新列表。
方法二:explode + groupby(高效向量化,适合大数据集)
如果你的DataFrame行数很多,apply的循环效率会偏低,这时候可以用Pandas的向量化操作来提速:
# 步骤1:把字典列表拆分成单独的行 exploded_df = df.explode('list_dicts') # 步骤2:从每个字典中提取'name'值 exploded_df['name'] = exploded_df['list_dicts'].str['name'] # 步骤3:按id分组,把name值重新聚合为列表 df['list_from_dict'] = exploded_df.groupby('id')['name'].agg(list)
这种方法完全利用Pandas的内置优化操作,避免了Python层面的循环,在数据量较大时性能会比apply好很多。
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

