如何将嵌套字典转换为扁平化结构的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
相关产品推荐
相关产品推荐

