如何利用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只能设置单层列名,无法满足同时引用两个维度的要求,具体步骤如下:
提取前两行构造MultiIndex
用pd.MultiIndex.from_arrays将第0行和第1行数据转为多层列名,并指定层级名称为Position和Side。保留数据行并替换列名
截取从第2行开始的实际数据,用新构造的MultiIndex替换原列名。执行筛选操作
通过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
相关产品推荐
相关产品推荐

