从字典将数据加载到MultiIndex Data Frame中

时间:2019-01-22 13:23:45

标签: python pandas

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。

谢谢!

3 个答案:

答案 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