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
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