我有一个如下所示的数据框,其中包含来自多个交易所的价格
side
和交易量
参数。
df = pd.DataFrame({
'price_ex1' : [9380.59650, 9394.85206, 9397.80000],
'side_ex1' : ['bid', 'bid', 'ask'],
'size_ex1' : [0.416, 0.053, 0.023],
'price_ex2' : [9437.24045, 9487.81185, 9497.81424],
'side_ex2' : ['bid', 'bid', 'ask'],
'size_ex2' : [10.0, 556.0, 23.0]
})
df
price_ex1 side_ex1 size_ex1 price_ex2 side_ex2 size_ex2
0 9380.59650 bid 0.416 9437.24045 bid 10.0
1 9394.85206 bid 0.053 9487.81185 bid 556.0
2 9397.80000 ask 0.023 9497.81424 ask 23.0
对于每个交易所(我有两个以上的交易所),我希望索引是所有交易所的所有价格的并集(即 price_ex1
、price_ex2
的并集等...)从最高到最低排名。然后,我想根据该交易所的 side
参数为每个交易所创建两个 size
列。输出应如下所示,其中空列为 NaN。
我不确定执行此操作的最佳 pandas 函数是什么,是枢纽还是融化,以及当我有超过 1 个二进制列要展平时如何使用该函数。
感谢您的帮助!
最佳答案
这是一个三步过程。更正多索引列后,您应该堆叠数据集,然后对其进行透视。
首先,清理多索引列,以便更轻松地进行转换:
df.columns = pd.MultiIndex.from_product([['1', '2'], [col[:-4] for col in df.columns[:3]]], names=['exchange', 'params'])
exchange 1 2
params price side size price side size
0 9380.59650 bid 0.416 9437.24045 bid 10.0
1 9394.85206 bid 0.053 9487.81185 bid 556.0
2 9397.80000 ask 0.023 9497.81424 ask 23.0
然后将交易所编号堆叠并附加到 bid
和 ask
值:
df = df.swaplevel(axis=1).stack()
df['side'] = df.apply(lambda row: row.side + '_ex' + row.name[1], axis=1)
params price side size
exchange
0 1 9380.59650 bid_ex1 0.416
2 9437.24045 bid_ex2 10.000
1 1 9394.85206 bid_ex1 0.053
2 9487.81185 bid_ex2 556.000
2 1 9397.80000 ask_ex1 0.023
2 9497.81424 ask_ex2 23.000
最后,按价格进行透视和排序:
df.pivot_table(index=['price'], values=['size'], columns=['side']).sort_values('price', ascending=False)
params size
side ask_ex1 ask_ex2 bid_ex1 bid_ex2
price
9497.81424 NaN 23.0 NaN NaN
9487.81185 NaN NaN NaN 556.0
9437.24045 NaN NaN NaN 10.0
9397.80000 0.023 NaN NaN NaN
9394.85206 NaN NaN 0.053 NaN
9380.59650 NaN NaN 0.416 NaN
关于Pandas 基于两个或多个二进制列融化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61820459/