使用新列名从dict中的dict创建数据帧

时间:2018-02-01 21:13:36

标签: python pandas dictionary

我有一本类似的字典:

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

我希望将第一个字典的键作为一列,将内部字典的键和值分别作为第二列和第三列使用新的列名。

4 个答案:

答案 0 :(得分:3)

使用from_dictstacksort_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