Python pandas,如何通过变量

时间:2015-06-03 00:07:27

标签: python pandas

我正在研究一种最终将使用来自大型多索引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原则并且仍然很脆弱,因为它无法处理多个方向整个切片选择。

那么,我可以通过一个变量来传递任何东西,它将在索引器中选择整个方向,如:?或者是否有更优雅的方式来选择整个方向?

1 个答案:

答案 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