Pandas 基于两个或多个二进制列的数据
我有一个看起来像这样的数据框,其中包括来自多个交易所的Pandas 基于两个或多个二进制列的数据,pandas,pivot,melt,Pandas,Pivot,Melt,我有一个看起来像这样的数据框,其中包括来自多个交易所的价格侧和音量参数 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],
价格
侧
和音量
参数
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\u ex1
,price\u ex2
等的联合),从高到低排列。然后,我想基于该交换的side
参数为每个交换创建两个size
列。当空列为NaN
时,输出应如下所示
我不确定什么是最好的pandas函数,它是pivot还是melt,以及当我有超过1个二进制列时如何使用该函数
谢谢你的帮助
你可以试试这样的东西 请用您向我们展示的数据制作一个数据框,并将其命名为“example.csv”
price_ex1 side_ex1 size_ex1 price_ex2 side_ex2 size_ex2
这是一个三步过程。更正多索引列后,应堆叠数据集,然后对其进行透视 首先,清理多索引列,以便更轻松地转换:
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
然后堆叠exchange num并将其附加到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
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