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

如何将DataFrame中含字典列表的列拆分为多个新列?

解决Pandas中从字典列表提取键为新列的问题

原始数据场景

你有如下结构的Pandas DataFrame,其中column2列的每行是一个字典列表:

import pandas as pd
data = [{"id":1,
         "column1":123, 
         "column2":[{"a":1}, {"b":"X"}, {"c":"2023-01-16"}]}]

df = pd.DataFrame(data)

原始DataFrame输出:

id  column1                                      column2
0   1      123  [{'a': 1}, {'b': 'X'}, {'c': '2023-01-16'}]

需求目标

需要将column2中的字典提取键作为新列,得到如下结构的DataFrame:

id  column1  a  b           c
0   1      123  1  X  2023-01-16

你尝试的方法及问题

你尝试使用explode分解列表,再用apply(pd.Series)转换字典,但结果不符合预期:

df = df.explode(column="column2")
# 分解后的输出:
#    id  column1              column2
# 0   1      123             {'a': 1}
# 0   1      123           {'b': 'X'}
# 0   1      123  {'c': '2023-01-16'}

df["column2"].apply(pd.Series)
# 转换后的输出(存在大量空值):
#      a    b           c
# 0  1.0  NaN         NaN
# 0  NaN    X         NaN
# 0  NaN  NaN  2023-01-16

两种可行的解决方法

方法一:合并字典列表为单个字典后转列

直接将每行的字典列表合并成一个完整字典,再转换为Series与原表拼接:

# 合并每行的字典列表为单个字典,转成Series后与原表拼接
df = df.join(df['column2'].apply(lambda x: pd.Series({k: v for d in x for k, v in d.items()})))
# 删除原column2列
df = df.drop('column2', axis=1)

执行后即可得到目标结构:

id  column1  a  b           c
0   1      123  1  X  2023-01-16

方法二:分解后分组聚合

基于你尝试的explode思路,补充分组聚合步骤来消除空值:

# 分解column2的列表
df_exploded = df.explode('column2')
# 将字典转换为列
df_new = df_exploded['column2'].apply(pd.Series)
# 拼接原始列与新列,按id和column1分组取首个非空值
result = pd.concat([df_exploded[['id', 'column1']], df_new], axis=1)\
           .groupby(['id', 'column1']).first().reset_index()

该方法通过分组聚合将分散在不同行的有效值合并到同一行,最终结果与目标一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:05:32