pandas - Pandas 融合基于两个或更多二进制列的数据
问题描述
我有一个看起来像这样的数据框,其中包含来自多个交易所的参数price
side
。volume
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 个要展平的二进制列时如何使用该函数。
谢谢您的帮助!
解决方案
这是一个三步过程。更正多索引列后,您应该堆叠数据集,然后对其进行旋转。
首先,清理多索引列,以便您更轻松地转换:
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
推荐阅读
- c++ - c ++类模板防止成员函数中的隐式转换
- c# - ASP.NET Core 依赖注入问题
- ruby-on-rails - ActionView::Template::Error(未定义方法 `to_model' 为 true:TrueClass 为更新属性方法
- javascript - 如何在angularjs中自动填充输入字段?
- aws-lambda - lambda 冷启动时间随着代码大小/Python 导入而增加
- c++ - 为什么我的代码不能从 C++ 中的 10 位数字开始工作?
- react-native - 为什么我的 React-Native 项目中的 Socket.io 仅在调试器运行时工作?
- arrays - 如何在 Ruby Languange 上用两个模式划分字符串?
- php - Laravel 5.5:如何从中间件和控制器中的 URL 获取参数?
- wordpress - 从存档调用的 CPT 页面上的 Wordpress 上一个和下一个链接