如何在Pandas DataFrame行中展开字典并设置唯一列名?
问题描述
我有一个如下所示的DataFrame,其中Col1列的每行都是字典:
Col1 A B {'A': 1, 'B': 23} apple carrot {'A': 3, 'B': 35} banana spinach
希望展开Col1列,将DataFrame转换为如下形式:
Col1.A Col1.B A B 1 23 apple carrot 3 35 banana spinach
请问如何用Python的Pandas实现?是否有其他方法?尝试过pd.explode但新生成的列名重复,该如何避免?
解决方案
方法1:使用pd.json_normalize(推荐)
这是Pandas专门为嵌套字典设计的展开工具,简单高效:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Col1': [{'A': 1, 'B': 23}, {'A': 3, 'B': 35}], 'A': ['apple', 'banana'], 'B': ['carrot', 'spinach'] }) # 展开Col1并添加前缀避免列名冲突,再合并原表其他列 expanded_df = pd.json_normalize(df['Col1']).add_prefix('Col1.').join(df.drop('Col1', axis=1)) print(expanded_df)
运行后直接得到目标格式,add_prefix('Col1.')是关键——给展开后的列加上前缀,完美避开原表的A、B列名重复问题。
方法2:用apply+pd.Series手动展开
如果想更直观地控制展开过程,可以用apply把每行字典转成Series,再拼接回原表:
# 把Col1的字典转成带前缀的列 expanded_col1 = df['Col1'].apply(pd.Series).add_prefix('Col1.') # 拼接原表去掉Col1的部分 expanded_df = pd.concat([expanded_col1, df.drop('Col1', axis=1)], axis=1)
这个方法逻辑清晰,适合理解基础原理,同样靠add_prefix解决列名重复。
关于pd.explode的问题
pd.explode是用来展开列表/数组类型的列,根本不适合处理字典。你遇到列名重复,本质是用错了工具。如果硬要往这个方向凑,得先把字典转成键值对列表再处理,步骤繁琐且效率低,完全不如上面两种方法实用,直接放弃就好。
内容的提问来源于stack exchange,提问作者user20505088
相关产品推荐
相关产品推荐

