如何从Pandas多级索引DataFrame中筛选此类期货市场数据?
从Pandas多级索引DataFrame提取指定数据的解决方案
嘿,我来帮你搞定这个期货数据的多级索引筛选问题!针对你给出的场景,我们可以利用Pandas的多级索引操作方法,轻松把df1里的合约收盘价提取到df2中,下面是具体步骤和代码:
完整代码示例
import pandas as pd import numpy as np # 初始化多级索引DataFrame df1 date_index = pd.date_range('2018-03-20', periods=10) contract = ['ZN1805', 'ZN1806', 'ZN1807'] price = ['open', 'close'] columns = pd.MultiIndex.from_product([contract, price], names=['contract', 'price']) df1 = pd.DataFrame(data=np.random.randint(100, 150, (10, columns.shape[0])), index=date_index, columns=columns) # 方法1:直接生成符合要求的df2 # 提取所有合约的close价格列 close_prices = df1.xs('close', level='price', axis=1) # 将宽表转为长表,匹配df2的结构 df2 = close_prices.stack().reset_index(name='close') df2 = df2.rename(columns={'level_0': 'date'}) # 可选:重命名日期列 # 方法2:如果已经初始化了df2,填充数据进去 # df2 = pd.DataFrame(columns=['contract', 'close'], index=df1.index) # 先提取所有close价格并转为长表,然后填充到df2 # close_series = df1.xs('close', level='price', axis=1).stack() # df2['contract'] = close_series.index.get_level_values('contract') # df2['close'] = close_series.values
关键步骤解释
- 提取指定层级的列:使用
df1.xs('close', level='price', axis=1),xs是Cross Section的缩写,专门用于多级索引的快速筛选。这里指定level='price'表示筛选价格层级为close的列,axis=1表示操作的是列索引。 - 转换表结构:
close_prices是一个宽表(每列对应一个合约的收盘价),用stack()方法可以把列索引的contract层级转成行索引的一部分,得到一个带多级行索引的Series,再用reset_index()把索引转为普通列,就得到了date、contract、close的结构,完美匹配df2的需求。 - 填充已有df2的方式:如果已经提前创建了df2,可以通过提取多级索引的层级值(
get_level_values)来填充contract列,再把Series的值赋值给close列。
这样就能轻松从多级索引的df1中提取你需要的合约收盘价数据啦!
内容的提问来源于stack exchange,提问作者StayFoolish




