You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:45:57