微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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原则并且仍然很脆弱,因为它无法处理多个方向整个切片选择.

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

解决方法:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐