Pandas 基于两个或多个二进制列融化数据

标签 pandas pivot melt

我有一个如下所示的数据框,其中包含来自多个交易所的价格 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_ex1price_ex2 的并集等...)从最高到最低排名。然后,我想根据该交易所的 side 参数为每​​个交易所创建两个 size 列。输出应如下所示,其中空列为 NaN。

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

感谢您的帮助!

enter image description here

最佳答案

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

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

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

关于Pandas 基于两个或多个二进制列融化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61820459/

相关文章:

python - Pandas根据Excel中的条件更改字体颜色并保存到相同的excel python

python - 我们如何从字典列表的字典创建数据框

mysql - 在某些条件下将行转换为列

r - 在列表上使用 reshape2::melt 时如何指定级别名称?

python - 如何在Python中将csv文件映射到另一个文件?

python - 如何修改 Pandas 的 Read_html 用户代理?

r - Pivot_longer 6 列至 3 列

sql - 行到列

r - 在R中,使用melt(),如何隐藏警告消息?

python - 使用 pandas 融化列中不均匀的数据并忽略 NaN