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
