Pandas 多层索引数据框删除行

3

我有一个如下的多重索引数据框:

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

我能做得更好吗?


可能是从DataFrame中选择多个键的交叉部分的重复问题。 - FLab
3个回答

4

一种方法是使用 get_level_values() 方法中的 index 参数:

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

2
找到了一个更简洁的解决方案,使用了“level”参数: df = df[df.index.isin(idx_to_keep, level=0)] - James Kang

3
你可以直接使用loc:
df.loc[['a']]

生成的输出结果:
       col
i1 i2     
a  c     5
   d     6

2
你正在寻找.xs
df.xs('a', axis=0, level=0, drop_level=False)

这意味着:
       col
i1 i2     
a  c     5
   d     6

2
如果想要保留索引级别0,可以指定 drop_level=False - Andrew L
1
如果我想保留不止一个变量(例如同时保留'a'和'b'),该怎么办? - James Kang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接