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

如何将嵌套字典转换为扁平化结构的Pandas DataFrame?

如何将Pandas DataFrame中的字典列扁平化为多行结构

问题场景

我在使用Pandas分析实验数据时得到了一个嵌套字典:

data = {'ah03Di': {'1': 11, '2': 11, '3': 12, '4': 14}, 
        'an02Ka': {'1': 6, '2': 11, '3': 7, '4': 9}}

用pd.DataFrame(list(data.items()), columns=['code', 'week1_2'])生成DataFrame后,week1_2列存储的是字典类型,结构如下:

code                     week1_2
0  ah03Di  {'1': 11, '2': 11, '3': 12, '4': 14}
1  an02Ka   {'1': 6, '2': 11, '3': 7, '4': 9}

现在需要将其转换为多行扁平化结构,每行对应一个code和字典中的数值,期望输出如下:

code  value
0  ah03Di     11
1  ah03Di     11
2  ah03Di     12
3  ah03Di     14
4  an02Ka      6
5  an02Ka     11
6  an02Ka      7
7  an02Ka      9

解决方案

这里有两种简便高效的方法可以实现这个需求:

方法1:利用explode快速展开(仅保留值的场景)

如果不需要保留字典中的键(比如示例里的1/2/3/4),只需要提取值并展开成多行,这种方法最简洁:

import pandas as pd

# 生成初始DataFrame
data = {'ah03Di': {'1': 11, '2': 11, '3': 12, '4': 14}, 
        'an02Ka': {'1': 6, '2': 11, '3': 7, '4': 9}}
df = pd.DataFrame(list(data.items()), columns=['code', 'week1_2'])

# 将字典列转为值的列表,再展开
df['week1_2'] = df['week1_2'].apply(lambda x: list(x.values()))
result = df.explode('week1_2').rename(columns={'week1_2': 'value'}).reset_index(drop=True)

print(result)

方法2:apply(pd.Series) + melt(保留键的场景)

如果需要同时保留字典中的键(比如周数),可以先将字典展开为多列,再融合为多行:

import pandas as pd

# 生成初始DataFrame
data = {'ah03Di': {'1': 11, '2': 11, '3': 12, '4': 14}, 
        'an02Ka': {'1': 6, '2': 11, '3': 7, '4': 9}}
df = pd.DataFrame(list(data.items()), columns=['code', 'week1_2'])

# 将字典列展开为多列,与原code列合并
expanded_df = pd.concat([df['code'], df['week1_2'].apply(pd.Series)], axis=1)
# 融合为多行结构,保留code和值,可选保留键(variable列)
result = expanded_df.melt(id_vars='code', var_name='week', value_name='value').drop(columns='week')  # 若需要week列可去掉drop
result = result.reset_index(drop=True)

print(result)

两种方法都能快速得到你想要的扁平化结构,根据是否需要保留字典键来选择即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:17