Getting TypeError: unhashable type: 'slice' when slicing multilevel column using loc

Getting TypeError: unhashable type: 'slice' when slicing multilevel column using loc

objective 是用 a 对级别 0 进行切片。

但是,当如下切片多索引列时,

a_cols=df.loc[:,('a',slice(None))]

编译器return

TypeError: unhashable type: 'slice'

import pandas as pd
import numpy as np
np.random.seed(0)
arr=np.random.randint(5, size=(2, 12))

df=pd.DataFrame(arr,columns=[('a','E1_g1'),('a','E1_g2'),('a','E1_g3'),
                                                        ('a','E2_g1'),('a','E2_g2'),('a','E2_g3'),
                                                        ('a','E3_g1'),('a','E3_g2'),('a','E3_g3'),
                                                        ('b','E1'),('b','E1'),('b','E13'),])

请问我做错了什么吗?

我也试过了

df.loc[:, df.columns.get_level_values(0) == 'a']

但是,生成了一个空的 df

那是因为 df.columns 不是 MultiIndex。您可以使用通过过滤 df.columns:

创建的列表对其进行索引
cols = [(i,j) for (i,j) in df.columns if i=='a']
out = df[cols]

输出:

   (a, E1_g1)  (a, E1_g2)  (a, E1_g3)  (a, E2_g1)  (a, E2_g2)  (a, E2_g3)  (a, E3_g1)  (a, E3_g2)  (a, E3_g3)
0           4           0           3           3           3           1           3           2           4
1           2           1           0           1           1           0           1           4           3

您可以使用 MultiIndex.from_tuples 创建 df.columns MultiIndex。然后你的切片方法起作用了:

df.columns = pd.MultiIndex.from_tuples(df.columns)
a_cols = df.loc[:,('a',slice(None))]

输出:

      a                                                
  E1_g1 E1_g2 E1_g3 E2_g1 E2_g2 E2_g3 E3_g1 E3_g2 E3_g3
0     4     0     3     3     3     1     3     2     4
1     2     1     0     1     1     0     1     4     3