Pandas 多索引数据框删除行

Pandas Multiindex dataframe remove rows

我有如下 Multiiindex DF:

tuples = list(zip(*[['a', 'a', 'b', 'b'], ['c', 'd', 'c', 'd']]))
index = pd.MultiIndex.from_tuples(tuples, names=['i1', 'i2'])
df = pd.DataFrame([5, 6, 7, 8], index=index[:4], columns=['col'])

       col
i1 i2     
a  c     5
   d     6
b  c     7
   d     8

想要保留索引(0 级)在

中的行
idx_to_keep = ['a']

应该是一个简单的任务,但我想不出别的办法

idx_to_drop = np.setdiff1d(pd.unique(df.index.levels[0]), idx_to_keep)
df.drop(idx_to_drop, inplace = True)

       col
i1 i2     
a  c     5
   d     6

我可以做得更好吗?

您正在寻找.xs

df.xs('a', axis=0, level=0, drop_level=False)

给出:

       col
i1 i2     
a  c     5
   d     6

一种方法是使用 index 方法 get_level_values():

df
       col
i1 i2     
a  c     5
   d     6
b  c     7
   d     8

df[df.index.get_level_values(0).isin(idx_to_keep)]
       col
i1 i2     
a  c     5
   d     6

你可以只使用 loc:

df.loc[['a']]

结果输出:

       col
i1 i2     
a  c     5
   d     6