我正在研究一种最终将使用来自大型多索引pandas数据帧的数据切片的方法。我可以生成用于每个索引器的掩码(实际上是用于定义切片的值列表):
df.loc[idx[a_mask,b_mask],idx[c_mask,d_mask]]
这没关系,但在某些情况下,我真的想选择其中一些轴上的所有东西,相当于:
df.loc[idx[a_mask,b_mask],idx[:,d_mask]]
有没有办法让我传递冒号“:”,将第二个例子中的c_mask替换为变量?理想情况下,我只是将c_mask设置为类似“:”的值,但当然这不起作用(并且不应该因为如果我们有一个名为that的列,那该怎么办)。但有没有办法通过变量传递一个值,该变量沿着其中一个索引器传递“整个轴”?
我意识到我可以生成一个掩码,通过将所有值沿着适当的轴聚集在一起来选择所有内容,但这非常重要并且添加了大量代码。同样地,我可以将数据帧访问分解为5个场景(每个场景有一个:在其中,一个有四个掩码),但这似乎不符合DRY原则并且仍然很脆弱,因为它无法处理多个方向整个切片选择。
那么,我可以通过一个变量来传递任何东西,它将在索引器中选择整个方向,如:?或者是否有更优雅的方式来选择整个方向?
答案 0 :(得分:6)
idx[slice(None)]
相当于idx[:]
所以这些都是等价的。
In [11]: df = DataFrame({'A' : np.random.randn(9)},index=pd.MultiIndex.from_product([range(3),list('abc')],names=['first','second']))
In [12]: df
Out[12]:
A
first second
0 a -0.668344
b -1.679159
c 0.061876
1 a -0.237272
b 0.136495
c -1.296027
2 a 0.554533
b 0.433941
c -0.014107
In [13]: idx = pd.IndexSlice
In [14]: df.loc[idx[:,'b'],]
Out[14]:
A
first second
0 b -1.679159
1 b 0.136495
2 b 0.433941
In [15]: df.loc[idx[slice(None),'b'],]
Out[15]:
A
first second
0 b -1.679159
1 b 0.136495
2 b 0.433941
In [16]: df.loc[(slice(None),'b'),]
Out[16]:
A
first second
0 b -1.679159
1 b 0.136495
2 b 0.433941