python - 按子列将数据框拆分为多个数据框
问题描述
我找不到一种优雅的方式来拆分这张桌子:
Open Close High
stock1 stock2 stock1 stock2 stock1 stock2
.. .. .. .. .. ..
股票是子列,分成多个表,每个表对应一个股票,所以第一个表是
df_stock1
Open Close High
所以每个股票的表/数据框(可能> 2)然后返回一个数组dataframes
。
解决方案
你可以做这样的事情。这是一个虚构的数据框:
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame(np.random.randint(1, 10, (6, 6)),
columns=pd.MultiIndex.from_product([['Open', 'Close', 'High'],
['Stock1', 'Stock2']]))
打印:
Open Close High
Stock1 Stock2 Stock1 Stock2 Stock1 Stock2
0 3 3 7 2 4 7
1 2 1 2 1 1 4
2 5 1 1 5 2 8
3 4 3 5 8 3 5
4 9 1 8 4 5 7
5 2 6 7 3 2 9
然后使用 groupby 和 DataFrame.xs 拆分您的多索引 df,执行以下操作:
Split = {idx: df_sub.xs(idx, level=1, axis=1) for idx,df_sub in df.groupby(level=1, axis=1)}
print(Split['Stock1'])
其中df_sub
指的是多索引 df 的第一级。这给出了:
Open Close High
0 3 7 4
1 2 2 1
2 5 1 2
3 4 5 3
4 9 8 5
5 2 7 2
和
Split2 = {idx: df_sub.xs(idx, level=1, axis=1) for idx,df_sub in df.groupby(level=1, axis=1)}
print(Split2['Stock2'])
印刷:
Open Close High
0 3 2 7
1 1 1 4
2 1 5 8
3 3 8 5
4 1 4 7
5 6 3 9
编辑其他级别
同样,如果你想要所有的 Open 股票,你可以这样做:
Split_open = {idx: df_sub.xs(idx, level=0, axis=1) for idx,df_sub in df.groupby(level=0, axis=1)}
print(Split_open['Open'])
返回:
Stock1 Stock2
0 3 3
1 2 1
2 5 1
3 4 3
4 9 1
5 2 6
推荐阅读
- python - raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type bytes is not JSON serializable
- jenkins - Jenkins 主页指向入门页面
- angular - 错误 NullInjectorError: R3InjectorError(AppModule) - 使用 DI 进行角度内容翻译
- kubernetes - Azure Kubernetes 服务 -> Confluent 云连接问题
- ios - 折线图 iOS 不显示图表条目
- docker - 使用 debian 作为基础镜像时如何添加用户
- ios - Xcode中的弱链接静态库
- jquery - 如何通过引导表方法动态附加thead?
- terraform - 将 aws 资源导入具有 for_each 的 terraform 模块
- grpc - Liberty (wlp-javaee8.21.0.0.8) 上的 GRPC 服务在 EAR 中部署时无法绑定