我有一个如下所示的数据框:
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
前两行是其余行的标识值(第一行称为
Position
,第二行称为 Side
)。 我想创建列名称,并将这些行作为标识符,这将允许 df 轻松地沿行和列进行切片。
例如,我希望能够根据列标题值过滤 df,如下所示:
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
我尝试过
set_axis
属性,但这不允许引用列名称。 我该如何实现这一目标?
使用 pandas MultiIndex 作为多索引列:
df.columns = pd.MultiIndex.from_arrays([df.iloc[0], df.iloc[1]], names=['Position', 'Side'])
df = df.drop([0, 1])
然后您可以使用这些索引过滤
df
:
df.iloc[:, (df.columns.get_level_values('Side') == 0) & (df.columns.get_level_values('Position').isin([0, 1, 2, 3, 4]))]