Skip to main content
 首页 » 编程设计

python之将数据从字典加载到 MultiIndex Dataframe

2025年05月04日11mfrbuaa

This question与我的非常相似,但在我的例子中,我希望将每个样本作为 DataFrame 的一行引入。

来自这里:

sample={'user1': {'item11': 2.5, 'item12': 3.5, 'item13': 3.0},  
'user2': {'item21': 2.5},  
'user3': {'item31':4.5,'item32':1.0}} 

我怎样才能得到这个?

    user1                user2  user3 
    item11 item12 item13 item21 item31 item32 
0   2.5    3.5    3.0    2.5    4.5    1.0    

然后,当获得像这样的新样本时:

sample1={'user1': {'item11': 4.5, 'item12': 5.5, 'item13': 1.0},  
'user2': {'item21': 4.5},  
'user3': {'item31':5.5,'item32':3.0}} 
 

如何引入得到:

    user1                user2  user3 
    item11 item12 item13 item21 item31 item32 
0   2.5    3.5    3.0    2.5    4.5    1.0    
1   4.5    5.5    1.0    4.5    5.5    3.0    

请注意,每个示例始终具有相同的用户,并且每个用户始终具有相同的项目。例如 user3 总是有 item31 和 item32。

谢谢!

请您参考如下方法:

将嵌套字典理解与 MultiIndex.from_tuples 结合使用带有样本列表以获得更好的性能:

sample={'user1': {'item11': 2.5, 'item12': 3.5, 'item13': 3.0},  
'user2': {'item21': 2.5},  
'user3': {'item31':4.5,'item32':1.0}} 
 
sample1={'user1': {'item11': 4.5, 'item12': 5.5, 'item13': 1.0},  
'user2': {'item21': 4.5},  
'user3': {'item31':5.5,'item32':3.0}} 
 
samples = [sample, sample1] 
 
L = [{(k, k1): v1 for k, v in s.items() for k1, v1 in v.items()} for s in samples] 
 
mux = pd.MultiIndex.from_tuples(set(y for x in L for y in x.keys())) 
df = pd.DataFrame(L, columns = mux).sort_index(axis=1) 
print (df) 
   user1                user2  user3        
  item11 item12 item13 item21 item31 item32 
0    2.5    3.5    3.0    2.5    4.5    1.0 
1    4.5    5.5    1.0    4.5    5.5    3.0 

如果不可能,单独创建每个 DataFrame,然后 concat :

L = {(k, k1): v1 for k, v in sample.items() for k1, v1 in v.items()} 
df = pd.DataFrame(L, index=[0]) 
 
L1 = {(k, k1): v1 for k, v in sample1.items() for k1, v1 in v.items()} 
df1 = pd.DataFrame(L1, index=[0]) 
 
df = pd.concat([df, df1], ignore_index=True) 
print (df) 
 
   user1                user2  user3        
  item11 item12 item13 item21 item31 item32 
0    2.5    3.5    3.0    2.5    4.5    1.0 
1    4.5    5.5    1.0    4.5    5.5    3.0