如何拆分Pandas DataFrame列中的字典为新列并展开成行?
嘿,我刚好处理过类似的需求,给你两种实用的解决方案,亲测有效:
方法一:用
apply+stack组合处理 这是比较经典的处理方式,适配各种Pandas版本:
import pandas as pd # 你的原始数据 df = pd.DataFrame([{'A': {'k1': 10}}, {'A': {'k2': 20, 'k3': 30}}, {'A': {'k4': 15}}]) # 核心处理代码 result = df['A'].apply(pd.Series).stack().reset_index(level=1).rename(columns={'level_1': 'keys', 0: 'values'}) # 清理多余列并重置索引 result = result.drop('A', axis=1).reset_index(drop=True) print(result)
步骤拆解:
df['A'].apply(pd.Series):把列A里的每个字典转换成Series,原来的一行会扩展成多列(列名就是字典的键),没有的键会自动填充NaN;.stack():把列索引“压”成行索引,这样所有非NaN的键值对都会变成单独的一行,形成多级索引的Series;.reset_index(level=1):把第二级索引(也就是原来的字典键)转成普通列,同时保留值列;- 最后重命名列、删掉多余的列并重置索引,就得到你要的结果啦。
方法二:更高效的
explode方案(Pandas 1.3.0+) 如果你的Pandas版本在1.3.0及以上,推荐用这个方法,数据量大的时候速度会快很多:
import pandas as pd df = pd.DataFrame([{'A': {'k1': 10}}, {'A': {'k2': 20, 'k3': 30}}, {'A': {'k4': 15}}]) # 先把字典转成键值元组的列表 df['A'] = df['A'].apply(lambda x: list(x.items())) # 把列表里的每个元组拆成单独一行 result = df.explode('A') # 把元组拆成两列 result[['keys', 'values']] = pd.DataFrame(result['A'].tolist(), index=result.index) # 清理收尾 result = result.drop('A', axis=1).reset_index(drop=True) print(result)
步骤拆解:
lambda x: list(x.items()):把每个字典转成[(键, 值)]这样的元组列表;explode('A'):把列表中的每个元组单独拆成一行,这一步是Pandas 1.3.0新增的实用功能;pd.DataFrame(result['A'].tolist()):把元组列直接拆分成两列,最后清理掉多余的列就行。
不管用哪种方法,最终都会输出你想要的结果:
keys values 0 k1 10 1 k3 30 2 k2 20 3 k4 15
内容的提问来源于stack exchange,提问作者Vivek Harikrishnan
相关产品推荐
相关产品推荐

