PythonPandas:对双多索引 Dataframe 中的行和列都使用pd.IndexSlice

cidc1ykv  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(78)

我有一个双多索引 Dataframe ,如下所示。我用idx = pd.IndexSlice对行进行切片,但我不知道如何对列进行同样的操作,因此提供了以下数据:

df = pd.DataFrame(data=pd.DataFrame(data=np.random.randint(0, 10, size=(9, 5))))
# rows
list1 = ['2021-01-01','2022-02-01','2022-03-01']
list2 = ['PHOTO', 'QUE','TXR']
combinations = [(x, y) for x in list1 for y in list2]     
df.index = pd.MultiIndex.from_tuples(combinations, names = ["DATE","DB"])
df.index.set_names(["DATE","DB"], inplace=True)
#columns
list1c = [('AB30','ACTIVE','A2'),('CD55','ACTIVE','A1'),('ZT52','UNACTIVE','A2'),('MIKE','PENSIONER','A2'),('ZZ00001','ACTIVE','A1')]
df.columns = pd.MultiIndex.from_tuples(list1c, names = ["UserID","KIND","DEPARTMENT"])

我按如下方式对行进行切片:

# filtering in rows
idx = pd.IndexSlice

###### ROWS #######
# slicing dates
date_start = '2021-01-01'
date_end   = '2021-02-01'
# slicing databases
databases = ['PHOTO','QUE']

# creating the index sclice for rows
i_s = idx[date_start:date_end, databases]

###### COLUMNS ######
# ??? here mask for the columns i_c = ???

df.loc[i_s, ]

我的目标是使用相同的方法对列进行切片,那么我如何为列生成IndexSlice,例如:
伪代码:类型=活动部门= A2
我想使用相同的方法,为每个多级定义一个掩码

hmae6n7t

hmae6n7t1#

您可以用途:

i_c = idx[: , 'ACTIVE', 'A2']

df.loc[i_s, i_c]

输出:

UserID             AB30
KIND             ACTIVE
DEPARTMENT           A2
DATE       DB          
2021-01-01 PHOTO      5
           QUE        9

现役军人或退休军人

i_c = idx[: , ['ACTIVE', 'PENSIONER'], 'A2']

df.loc[i_s, i_c]

输出:

UserID             AB30      MIKE
KIND             ACTIVE PENSIONER
DEPARTMENT           A2        A2
DATE       DB                    
2021-01-01 PHOTO      5         3
           QUE        9         2
1yjd4xko

1yjd4xko2#

使用此代码,您应该能够选择类型为“ACTIVE”且部门为“A2”的列

columns = (slice(None), 'ACTIVE', 'A2')
df_sliced = df.loc[:, columns]

还可以使用.xs方法按列的级别名称对列进行切片。
例如:

df_sliced = df.xs('ACTIVE', level='KIND', axis=1)

将DataFrame切片为仅包含KIND为“ACTIVE”的列。

相关问题