首页 > 解决方案 > Pandas 融合基于两个或更多二进制列的数据

问题描述

我有一个看起来像这样的数据框,其中包含来自多个交易所的参数price sidevolume

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等的联合),从高到低排列。然后我想根据该交换的参数size为每个交换创建两列。side输出应该看起来像这样,其中空列是NaN

我不确定执行此操作的最佳 pandas 函数是什么,它是枢轴还是熔化,以及当我有超过 1 个要展平的二进制列时如何使用该函数。

谢谢您的帮助!

在此处输入图像描述

标签: pandaspivotmelt

解决方案


这是一个三步过程。更正多索引列后,您应该堆叠数据集,然后对其进行旋转。

首先,清理多索引列,以便您更轻松地转换:

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

然后堆叠并将交换编号附加到bidask值:

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

推荐阅读