Python pandas.DataFrame的子集(切片)具有与原始DataFrame相同的索引

Python pandas.DataFrame的子集(切片)具有与原始DataFrame相同的索引,python,pandas,Python,Pandas,假设我有一个多索引的数据帧,如下所示: In [1]:d=pnd.DataFrame(range(5),index=pnd.MultiIndex.from_tuples([('A',1),('A',2),('A',3),('A',4),('A',5)])) In [2]: d Out[2]: 0 A 1 0 2 1 3 2 4 3 5 4 我可以通过子集创建另一个数据帧: In [3]: p=d.loc[('A',slice(1,3)),:].copy(

假设我有一个多索引的数据帧,如下所示:

In [1]:d=pnd.DataFrame(range(5),index=pnd.MultiIndex.from_tuples([('A',1),('A',2),('A',3),('A',4),('A',5)]))

In [2]: d
Out[2]: 
     0
A 1  0
  2  1
  3  2
  4  3
  5  4
我可以通过子集创建另一个数据帧:

In [3]: p=d.loc[('A',slice(1,3)),:].copy()

In [4]: p
Out[4]: 
     0
A 1  0
  2  1
  3  2
但是这个新数据帧的索引对象与原始数据帧的索引对象相同(包含“级别”中的所有原始项)

如何复制不“记住”原始数据帧的索引对象的子集


我之所以需要这样做,是因为我的一些函数访问index对象以获取元数据,而索引从原始数据帧中继承下来的事实混淆了这些函数

如果不关心子集中索引的顶层,可以设置

p.index = p.index.droplevel()
p.index
Int64Index([1, 2, 3], dtype='int64')
或者,如果您想保留多索引,只需重置级别,您可以调用
set\u levels

p.index = p.index.set_levels(p.index.droplevel(),1)
p.index
MultiIndex(levels=[['A'], [1, 2, 3]],
       labels=[[0, 0, 0], [0, 1, 2]])

谢谢我想后一种解决方案会起作用,因为我想保持最高水平。但这似乎不雅观,因为顶级标签必须明确地作为参数来设置_级别。因此,如果我基于第二个级别创建子集,后一种解决方案就可以了。第一级的子集如何?我最终显式地创建了新索引,然后将其分配给子集。这个问题必须有更自然的解决办法!
p.index = p.index.set_levels(p.index.droplevel(),1)
p.index
MultiIndex(levels=[['A'], [1, 2, 3]],
       labels=[[0, 0, 0], [0, 1, 2]])