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

如何从Pandas字典列生成新列?现有方法存在值覆盖问题

Pandas 字典列展开为多列的解决方案

问题场景

假设你的Pandas DataFrame中有一列存储着字典数据,示例数据如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'dictionary': [
        {'A': 'apple', 'B': 'bucket', 'C': 'cat'},
        {'A': 'apple1', 'B': 'bucket1', 'D': 'doggy1'}
    ]
})

需求是将字典中的每个键值对展开为单独的列,键作为列名,对应值填入,缺失的键填充为None,同时保留原dictionary列,期望结果如下:

A       B     C       D             dictionary
0   apple  bucket  cat    None  {'A': 'apple', 'B': 'bucket', 'C': 'cat'}
1  apple1 bucket1 None  doggy1  {'A': 'apple1', 'B': 'bucket1', 'D': 'doggy1'}

原代码的问题

你尝试用pd.apply和自定义函数实现,但出现了整列值被覆盖、原列丢失的问题,原代码如下:

def dic_mapper(dic):
    for k, v in dic.items():
        df[k] = v

df['dictionary'] = df['dictionary'].apply(lambda x: dic_mapper(x) if x else None)

问题出在:

  • 函数内直接对df[k]赋值,每次循环会将整列覆盖为当前行的字典值,最终所有行都会是最后一行的字典内容
  • apply将原dictionary列替换成了函数的返回值(函数无return,所以是None),导致原列丢失

正确解决方案

方法一:用pd.DataFrame构造后合并

将字典列转换为新的DataFrame,再和原DataFrame横向合并:

# 从字典列生成新的DataFrame,缺失键自动填充为NaN(显示为None)
dict_expanded = pd.DataFrame(df['dictionary'].tolist())
# 合并原DataFrame和展开后的DataFrame,保留原dictionary列
result_df = pd.concat([df, dict_expanded], axis=1)

方法二:用apply(pd.Series)结合join

这是更简洁的写法,直接将每个字典转为Series,自动对齐列后与原DataFrame合并:

result_df = df.join(df['dictionary'].apply(pd.Series))

两种方法都能实现需求,且不会修改原数据,自动处理缺失的键,完美保留原dictionary列。

内容的提问来源于stack exchange,提问作者amnesic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:38:10