如何在Pandas DataFrame中展开嵌套字典列?
如何将DataFrame中字典列表列展开为独立列
针对你提供的DataFrame结构,这里有两种实用方法可以提取actions列中的字典数据,生成以action_type为列名的独立字段:
方法一:直接转换字典列表为宽格式(适合单条/每条记录对应完整字典列表)
这种方法无需拆分行,直接对每行的字典列表做转换,效率更高:
import pandas as pd # 原数据 df1 = pd.DataFrame({ 'campaign_name': ['Campanha A'], 'date_start': ['2022-01-01'], 'date_stop': ['2022-01-31'], 'reach': [1060], 'impressions': [2040], 'clicks': [72], 'amount_spent': [79.32], 'cpc': [1.10], 'ctr': [3.53], 'actions': [ [{'action_type': 'post', 'value': '4'}, {'action_type': 'post_engagement', 'value': '3'}, {'action_type': 'post_reaction', 'value': '1'}] ] }) # 1. 处理actions列:将每行的字典列表转为以action_type为列的DataFrame actions_df = df1['actions'].apply( lambda x: pd.DataFrame(x).set_index('action_type')['value'] ).apply(pd.Series) # 2. 将字符串类型的value转为数值类型 actions_df = actions_df.astype(int) # 3. 合并原数据与处理后的actions列,删除原actions字段 result_df = pd.concat([df1.drop('actions', axis=1), actions_df], axis=1) print(result_df)
运行后输出的DataFrame就是你需要的格式,其中post、post_engagement、post_reaction会作为独立列存在。
方法二:explode拆分+ pivot转宽(适合多条记录的批量处理)
如果你的DataFrame有多行数据,每行的actions列都包含字典列表,可以用这种通用方法:
# 1. 将actions列的列表拆分为多行 df_exploded = df1.explode('actions') # 2. 将字典类型的actions字段展开为单独列 df_exploded = pd.concat( [df_exploded.drop('actions', axis=1), df_exploded['actions'].apply(pd.Series)], axis=1 ) # 3. 将长格式数据转为宽格式,把action_type作为列名 result_df = df_exploded.pivot( index=df_exploded.columns.difference(['action_type', 'value']).tolist(), columns='action_type', values='value' ).reset_index().astype({ 'post': int, 'post_engagement': int, 'post_reaction': int })
关键说明
- 两种方法的核心都是把字典结构的字段提取为独立列,区别在于是否需要拆分行;
- 最后通过
astype()转换数据类型,确保数值列不是字符串格式; - 你之前用
explode未得到预期结果,是因为explode仅拆分列表为多行,还需要额外把字典展开为列(即方法二中的第二步)。
内容的提问来源于stack exchange,提问作者Guilherme Henrique Favaro
相关产品推荐
相关产品推荐

