我有一本类似的字典:
dictionary = {'A' : {'a': 2,
'b': 3,
'c': 4},
'B' : {'a': 4,
'd': 3,
'e': 3}}
我想创建一个看起来像
的数据框 P1 P2 P3
0 A a 2
1 A b 3
2 A c 4
3 B a 4
4 B d 3
5 B e 3
我希望将第一个字典的键作为一列,将内部字典的键和值分别作为第二列和第三列使用新的列名。
答案 0 :(得分:3)
使用from_dict
,stack
和sort_values
:
(pd.DataFrame.from_dict(dictionary)
.stack()
.reset_index()
.set_axis(['P2','P1','P3'], axis=1, inplace=False)
.sort_values(['P1','P2'])
.sort_index(1))
输出:
P1 P2 P3
0 A a 2.0
2 A b 3.0
3 A c 4.0
1 B a 4.0
4 B d 3.0
5 B e 3.0
答案 1 :(得分:2)
在创建数据框之前,将嵌套的dict转换为列表列表:
>>> pd.DataFrame([[k, kk, vv] for k, v in dictionary.items() for kk, vv in v.items()],
columns=['P1', 'P2', 'P3'])
P1 P2 P3
0 A a 2
1 A b 3
2 A c 4
3 B a 4
4 B d 3
5 B e 3
答案 2 :(得分:1)
使用pd.Serise
pd.Series(d).apply(pd.Series).stack().reset_index()
Out[464]:
level_0 level_1 0
0 A a 2.0
1 A b 3.0
2 A c 4.0
3 B a 4.0
4 B d 3.0
5 B e 3.0
答案 3 :(得分:0)
我的回答与Scott的回答非常相似,但是我们在评论中都提到过,如果您没有版本0.21.0
+,则会收到TypeError: set_axis() got multiple values for argument 'axis'
。以下是我正在处理0.20.2
pd.DataFrame.from_dict(dictionary).stack().sort_values()\ #original read and stack
.reset_index()\ #reseting the index
.sort_values(['level_1', 'level_0'])\ #sorting the values based on your needed ouput
.rename(index=str, columns={'level_0': 'P2', 'level_1' : 'P1', 0:'P3'})\ #renaming the columns
.reindex_axis(axis = 1, labels=['P1', 'P2','P3']) #putting the columns in correct order
P1 P2 P3
0 A a 2.0
1 A b 3.0
5 A c 4.0
4 B a 4.0
2 B d 3.0
3 B e 3.0