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。
谢谢!
答案 0 :(得分:3)
结合MultiIndex.from_tuples
和示例列表使用嵌套dict理解,以获得更好的性能:
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
答案 1 :(得分:2)
stack
+ swaplevel
您可以将嵌套字典提供给pd.DataFrame
构造函数stack
,交换索引级别,转换为数据框,最后转置。
df = pd.DataFrame(sample).stack().swaplevel().to_frame().T
print(df)
user1 user2 user3
item11 item12 item13 item21 item31 item32
0 2.5 3.5 3.0 2.5 4.5 1.0
然后从新字典sample1
追加数据:
df = df.append(pd.DataFrame(sample1).stack().swaplevel().to_frame().T)
如果本身并不一定要逐行追加到数据框,我强烈建议您在收集所有 all 输入数据后,在一次调用中重新构造逻辑以构造数据框。 docs包含一个与pd.concat
相关的示例。
答案 2 :(得分:2)
您可以使用pd.concat
+ DataFrame.from_dict()
来获取它,最后进行转置:
>>> pd.concat({k: pd.DataFrame.from_dict(v, 'index') for k, v in sample.items()}, axis=0).T
user1 user2 user3
item11 item12 item13 item21 item31 item32
0 2.5 3.5 3.0 2.5 4.5 1.0
OR
pd.concat({k: pd.DataFrame.from_dict(v, orient='index') for k, v in sample.items()}).T # you can chosse `orient` to have index