如何从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
相关产品推荐
相关产品推荐

