将字典放入包含分层索引和列

时间:2017-03-01 20:40:45

标签: python pandas

我正在尝试将下面的字典变成一个更好的DataFrame格式,以方便观看。该数据字典是在访问api并解析XML之后创建的,所以我当然愿意将数据放在一起以使这个过程更容易。

我的格式是这个(其他两个市场没有显示水平放置在彼此旁边):

                    Market1
                          B                      S
                     Depth1 Depth2  Depth3  Depth1  Depth2  Depth3
actionIndicator           B      B       B       S       S       S
limit                   589    588     586     591     592     593
quantity            185.121  8.121  32.216  34.805  16.037  36.099 

我想要的格式是(未显示的两个市场应垂直堆叠并注意深度重新排序):

                                  B                      S
                             Depth3 Depth2  Depth1  Depth1  Depth2  Depth3
Market1    actionIndicator        B      B       B       S       S       S
           limit                587    588     589     591     592     593
           quantity         185.121  8.121  32.216  34.805  16.037  36.099

代码:

from pandas import DataFrame


data = {
 'Market1': {'B': {'Depth1': {'actionIndicator': 'B',
    'limit': '558',
    'quantity': '8.286'},
   'Depth2': {'actionIndicator': 'B', 'limit': '557', 'quantity': '8.355'},
   'Depth3': {'actionIndicator': 'B', 'limit': '555', 'quantity': '18.474'}},
  'S': {'Depth1': {'actionIndicator': 'S',
    'limit': '560',
    'quantity': '0.626'},
   'Depth2': {'actionIndicator': 'S', 'limit': '561', 'quantity': '17.101'},
   'Depth3': {'actionIndicator': 'S', 'limit': '562', 'quantity': '17.576'}}},
 'Market2': {'B': {'Depth1': {'actionIndicator': 'B',
    'limit': '478',
    'quantity': '8.182'},
   'Depth2': {'actionIndicator': 'B', 'limit': '477', 'quantity': '8.329'},
   'Depth3': {'actionIndicator': 'B', 'limit': '475', 'quantity': '30.156'}},
  'S': {'Depth1': {'actionIndicator': 'S',
    'limit': '479',
    'quantity': '37.483'},
   'Depth2': {'actionIndicator': 'S', 'limit': '480', 'quantity': '84.416'},
   'Depth3': {'actionIndicator': 'S', 'limit': '481', 'quantity': '37.659'}}},
 'Market3': {'B': {'Depth1': {'actionIndicator': 'B',
    'limit': '587',
    'quantity': '8.18'},
   'Depth2': {'actionIndicator': 'B', 'limit': '586', 'quantity': '8.382'},
   'Depth3': {'actionIndicator': 'B', 'limit': '583', 'quantity': '39.548'}},
  'S': {'Depth1': {'actionIndicator': 'S',
    'limit': '589',
    'quantity': '55.181'},
   'Depth2': {'actionIndicator': 'S', 'limit': '590', 'quantity': '17.289'},
   'Depth3': {'actionIndicator': 'S', 'limit': '591', 'quantity': '17.689'}}},
}

df = DataFrame.from_dict(
        {(k1, k2, k3): data[k1][k2][k3] for k1 in data.keys() for k2 in
         data[k1].keys() for k3 in data[k1][k2].keys()}, orient="columns")

print(df)

1 个答案:

答案 0 :(得分:0)

df = df.unstack().reorder_levels([0,3,2,1]).unstack(level=[3,2])

dfB = df[["B"]].sort_index(axis=1, ascending=False)
dfS = df[["S"]]

df = pd.concat([dfB, dfS], axis=1)

50%的功劳归功于Jan,他对unstack()解决方案发表了评论。

给出:

                              B                     S
                         Depth3 Depth2 Depth1  Depth1  Depth2  Depth3
Market1 actionIndicator       B      B      B       S       S       S
        limit               555    557    558     560     561     562
        quantity         18.474  8.355  8.286   0.626  17.101  17.576
Market2 actionIndicator       B      B      B       S       S       S
        limit               475    477    478     479     480     481
        quantity         30.156  8.329  8.182  37.483  84.416  37.659
Market3 actionIndicator       B      B      B       S       S       S
        limit               583    586    587     589     590     591
        quantity         39.548  8.382   8.18  55.181  17.289  17.689