如何select 一组基于top索引的multiindex列
How to select a set of multiindex column based on top index
给定一个 df
以下列,
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
objective是为了select只有这些栏目
('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2')
但是,通过
访问
df.loc[:, ('psd', slice(None))]
Return一个错误
TypeError: unhashable type: 'slice'
请问如何正确分割多索引列
以下代码片段可用于重现错误
import pandas as pd
import numpy as np
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
df=pd.DataFrame(np.random.rand(10,len(col)),columns=col)
h=df.loc[:, ('psd', slice(None))]
更新另一次尝试:
df.loc[:, 'psd']
Return
KeyError: 'psd'
Pandas版本
pandas1.3.5
让我们试试filter
df.filter(regex='_b', axis=1)
或者对整数列使用 loc 访问器。
df.iloc[:,2:7]
添加pd.MultiIndex.from_tuples
定义列,使其成为MultiIndex:
import pandas as pd
import numpy as np
col = pd.MultiIndex.from_tuples([('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')])
df = pd.DataFrame(np.random.rand(10,len(col)), columns=col)
df.loc[:, ('psd', slice(None))]
您的列索引不是 MultiIndex
,因此您不能使用 slice
。备选方案:
cols = df.columns[df.columns.map(lambda x: isinstance(x, tuple) and x[0] == 'psd')]
print(df[cols])
# Output
(psd, F1_b0) (psd, F2_b0) (psd, F3_b0) (psd, F1_b2) (psd, F2_b2)
0 0.833580 0.957044 0.368044 0.494838 0.339509
1 0.523737 0.864436 0.388843 0.212192 0.475181
2 0.372662 0.964883 0.081386 0.042451 0.296796
3 0.782194 0.036656 0.267184 0.205224 0.258894
4 0.546433 0.603225 0.988794 0.092446 0.064287
5 0.096330 0.966162 0.322264 0.293168 0.701630
6 0.452430 0.194375 0.944863 0.417981 0.078965
7 0.284814 0.078355 0.915552 0.642981 0.817181
8 0.241247 0.841468 0.020932 0.894918 0.436130
9 0.159180 0.988080 0.726285 0.600094 0.158365
给定一个 df
以下列,
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
objective是为了select只有这些栏目
('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2')
但是,通过
访问df.loc[:, ('psd', slice(None))]
Return一个错误
TypeError: unhashable type: 'slice'
请问如何正确分割多索引列
以下代码片段可用于重现错误
import pandas as pd
import numpy as np
col=['id','nval',('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')]
df=pd.DataFrame(np.random.rand(10,len(col)),columns=col)
h=df.loc[:, ('psd', slice(None))]
更新另一次尝试:
df.loc[:, 'psd']
Return
KeyError: 'psd'
Pandas版本
pandas1.3.5
让我们试试filter
df.filter(regex='_b', axis=1)
或者对整数列使用 loc 访问器。
df.iloc[:,2:7]
添加pd.MultiIndex.from_tuples
定义列,使其成为MultiIndex:
import pandas as pd
import numpy as np
col = pd.MultiIndex.from_tuples([('psd','F1_b0'),('psd','F2_b0'),('psd','F3_b0'),('psd','F1_b2'),('psd','F2_b2'),
('hj','F1'),('hj','F2'),('hj','F3'),('hj','C1'),('hj','C2'),('hj','C3')])
df = pd.DataFrame(np.random.rand(10,len(col)), columns=col)
df.loc[:, ('psd', slice(None))]
您的列索引不是 MultiIndex
,因此您不能使用 slice
。备选方案:
cols = df.columns[df.columns.map(lambda x: isinstance(x, tuple) and x[0] == 'psd')]
print(df[cols])
# Output
(psd, F1_b0) (psd, F2_b0) (psd, F3_b0) (psd, F1_b2) (psd, F2_b2)
0 0.833580 0.957044 0.368044 0.494838 0.339509
1 0.523737 0.864436 0.388843 0.212192 0.475181
2 0.372662 0.964883 0.081386 0.042451 0.296796
3 0.782194 0.036656 0.267184 0.205224 0.258894
4 0.546433 0.603225 0.988794 0.092446 0.064287
5 0.096330 0.966162 0.322264 0.293168 0.701630
6 0.452430 0.194375 0.944863 0.417981 0.078965
7 0.284814 0.078355 0.915552 0.642981 0.817181
8 0.241247 0.841468 0.020932 0.894918 0.436130
9 0.159180 0.988080 0.726285 0.600094 0.158365