You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用DataFrame前两行创建可筛选的多层列名?

问题:将两行数据设为DataFrame多层列名并实现维度筛选

原始DataFrame如下:

0       1       2       3       4       5       6       7       8       9       10      11      12      13      14      15      16      17      18      19
0   9.0     8.0     7.0     6.0     5.0     4.0     3.0     2.0     1.0     0.0     0.0     1.0     2.0     3.0     4.0     5.0     6.0     7.0     8.0     9.0
1   1.0     1.0     1.0     1.0     1.0     1.0     1.0     1.0     1.0     1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
2   4484.75 4485.0  4485.25 4485.5  4485.75 4486.0  4486.25 4486.5  4486.75 4487.0  4487.25 4487.5  4487.75 4488.0  4488.25 4488.5  4488.75 4489.0  4489.25 4489.5
3   4484.75 4485.0  4485.25 4485.5  4485.75 4486.0  4486.25 4486.5  4486.75 4487.0  4487.25 4487.5  4487.75 4488.0  4488.25 4488.5  4488.75 4489.0  4489.25 4489.5
4   4484.75 4485.0  4485.25 4485.5  4485.75 4486.0  4486.25 4486.5  4486.75 4487.0  4487.25 4487.5  4487.75 4488.0  4488.25 4488.5  4488.75 4489.0  4489.25 4489.5
5   4484.75 4485.0  4485.25 4485.5  4485.75 4486.0  4486.25 4486.5  4486.75 4487.0  4487.25 4487.5  4487.75 4488.0  4488.25 4488.5  4488.75 4489.0  4489.25 4489.5

其中第0行是Position标识,第1行是Side标识,需要将这两行设置为列名,实现类似df.loc[:,[(df.Position.isin(0,1,2,3,4)) & (df.Side==0)]]的筛选逻辑,最终得到如下子集:

10      11      12      13      14
2   4487.25 4487.5  4487.75 4488.0  4488.25
3   4487.25 4487.5  4487.75 4488.0  4488.25
4   4487.25 4487.5  4487.75 4488.0  4488.25
5   4487.25 4487.5  4487.75 4488.0  4488.25

解决方案

你需要使用**多层列索引(MultiIndex)**来实现这个需求,set_axis只能设置单层列名,无法满足同时引用两个维度的要求,具体步骤如下:

  1. 提取前两行构造MultiIndex
    用pd.MultiIndex.from_arrays将第0行和第1行数据转为多层列名,并指定层级名称为Position和Side。

  2. 保留数据行并替换列名
    截取从第2行开始的实际数据,用新构造的MultiIndex替换原列名。

  3. 执行筛选操作
    通过columns.get_level_values分别获取Position和Side层级的值,组合筛选条件。

完整代码示例:

import pandas as pd

# 假设原始DataFrame为df,先处理列名
# 构造多层列索引
multi_cols = pd.MultiIndex.from_arrays(
    [df.iloc[0], df.iloc[1]],
    names=['Position', 'Side']
)

# 保留数据行并设置新列名
df = df.iloc[2:].set_axis(multi_cols, axis=1)

# 执行筛选:Position在[0,1,2,3,4]且Side=0
mask = (df.columns.get_level_values('Position').isin([0,1,2,3,4])) & \
       (df.columns.get_level_values('Side') == 0)
filtered_df = df.loc[:, mask]

print(filtered_df)

执行后即可得到目标子集,此时你也可以通过层级名称直接访问列的属性,比如统计Position=0的列数据等。


内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:32:36