我正在尝试将下面的字典变成一个更好的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)
答案 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