Skip to main content
 首页 » 编程设计

python之如何将多头 Pandas 数据框转换为嵌套字典列表

2025年05月04日11qlqwjy

我有一个带有多个 header 的 Pandas 数据框。我想知道如何将其转换为嵌套目录列表。 Pandas 数据框中的每一行都是列表中的一个嵌套字典。

举个例子

#Creaet an example multiheader dataframe 
 
col =['id','x, single room','x, double room','y, single room','y, double room' ] 
df = pd.DataFrame([[1,2,3,4,5], [3,4,7,5,3]], columns=col) 
a = df.columns.str.split(', ', expand=True).values 
#swap values in NaN and replace NAN to '' 
df.columns = pd.MultiIndex.from_tuples([('', x[0]) if pd.isnull(x[1]) else x for x in a]) 
df 

结果

        x   y 
id  single room double room single room double room 
0   1   2   3   4   5 
1   3   4   7   5   3 

这是我要转换为嵌套字典列表的数据框。所以这是想要的结果

[{'id': 1, 
  'x': {'double room': 3, 'single room': 2}, 
  'y': {'double room': 5, 'single room': 4}}, 
 {'id': 3, 
  'x': {'double room': 7, 'single room': 4}, 
  'y': {'double room': 3, 'single room': 5}}] 

在下面的代码中,我直接创建了这个列表。

firstDict = { 'id':1, 'x':{'single room':2, 'double room':3}, 'y':{'single room':4, 'double room':5} } 
secondDict = { 'id':3, 'x':{'single room':4, 'double room':7}, 'y':{'single room':5, 'double room':3} } 
dictList = [] 
dictList.append( firstDict ) 
dictList.append( secondDict ) 
dictList 
 
[{'id': 1, 
  'x': {'double room': 3, 'single room': 2}, 
  'y': {'double room': 5, 'single room': 4}}, 
 {'id': 3, 
  'x': {'double room': 7, 'single room': 4}, 
  'y': {'double room': 3, 'single room': 5}}] 

总而言之,如何将数据帧 df 转换为 dictList 是什么。

编辑:

这是一个最小的例子,我正在寻找的解决方案应该推广到更多的 header 。

请您参考如下方法:

我认为没有直接的方法可以做到这一点,也就是说,您可以使用 stack + to_dict以及之后的一些后处理:

# prepare the DataFrame 
df = df.set_index(('', 'id')).stack(level=0) 
df.index.names = ['id', None] 
 
# convert to a dicts of dicts 
d = {} 
for (idi, key), values in df.to_dict('index').items(): 
    d.setdefault(idi, {}).update({key: values}) 
 
# convert d to list of dicts 
result = [{'id': k, **values} for k, values in d.items()] 

输出

[{'id': 1, 
  'x': {'double room': 3, 'single room': 2}, 
  'y': {'double room': 5, 'single room': 4}}, 
 {'id': 3, 
  'x': {'double room': 7, 'single room': 4}, 
  'y': {'double room': 3, 'single room': 5}}]