如何将含列表值的嵌套字典转换为Pandas DataFrame
将嵌套字典转为保留列表完整值的Pandas DataFrame
问题背景
你有如下嵌套字典:
my_dict={'1':{'name':'one', 'f_10':[1,10,20,30], 'f_20':[1,20,40,60]}, '2':{'name':'two', 'f_10':[2,12,22,32], 'f_20':[2,22,42,62]}}
需要转换为保留列表完整值的DataFrame,避免使用concat时列表被拆分为多行的问题。
解决方案
方法1:使用from_dict指定orient='index'
这是最直接的方式,orient='index'会将外层字典的键作为行索引,子字典的键作为列名,完整保留列表类型的单元格值:
import pandas as pd my_dict = {'1':{'name':'one', 'f_10':[1,10,20,30], 'f_20':[1,20,40,60]}, '2':{'name':'two', 'f_10':[2,12,22,32], 'f_20':[2,22,42,62]}} # 转换为DataFrame,外层字典键作为行索引 df = pd.DataFrame.from_dict(my_dict, orient='index') # 将行索引转为单独列,并重命名(可根据需求调整列名) df = df.reset_index().rename(columns={'index': 'id'}) print(df)
输出结果:
id name f_10 f_20 0 1 one [1, 10, 20, 30] [1, 20, 40, 60] 1 2 two [2, 12, 22, 32] [2, 22, 42, 62]
如果需要第一列列名为name(如你示例所示),可修改rename部分为rename(columns={'index': 'name'}),但注意会产生两个同名name列,建议使用不同名称避免混淆。
方法2:手动构造数据列表
如果需要更灵活的行构造逻辑,可以遍历字典手动组装每行数据:
import pandas as pd my_dict = {'1':{'name':'one', 'f_10':[1,10,20,30], 'f_20':[1,20,40,60]}, '2':{'name':'two', 'f_10':[2,12,22,32], 'f_20':[2,22,42,62]}} data_rows = [] for key, sub_dict in my_dict.items(): # 组合外层键和子字典内容为一行数据 row = {'id': key} row.update(sub_dict) data_rows.append(row) df = pd.DataFrame(data_rows)
为什么concat会拆分列表?
当你用concat拼接由子字典单独转换的DataFrame时,pandas会自动将列表类型的元素拆分成多行——因为它默认将列表视为可迭代序列。而上面两种方法都是直接将列表作为单一单元格值传入DataFrame,因此不会触发拆分。
内容的提问来源于stack exchange,提问作者S_S
相关产品推荐
相关产品推荐

