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