使用逻辑条件过滤pandas dataframe groupby的语法

时间:2016-10-13 18:35:55

标签: python pandas dataframe

我有一个pandas数据框,其中包含具有一对多关系的索引。我的数据的一个非常简化和缩短的示例显示在DataFrame Example链接中。我想获得nCldLayers< = 1的唯一namIdx值的列表或系列或ndarray。最终结果应显示601和603的索引。

  1. 我可以通过下面的3条陈述来实现这一目标,但我想知道是否有一个更好,更简洁的方式可能是'过滤器'选择&#39 ;或者'其中'。

    grouped=(namToViirs['nCldLayers']<=1).groupby(namToViirs.index).all(axis=0)
    grouped = grouped[grouped==True]
    filterIndex = grouped.index
    
  2. 通过在链的后续部分应用逻辑条件(namToViirs [&#39; nCldLayers&gt; = 1],是否有更好的方法来完成此结果,即第一组然后应用逻辑条件,然后只检索该组中每个成员的逻辑结果为真的namIdx?

4 个答案:

答案 0 :(得分:1)

我认为您的代码运行良好,只有您可以添加使用小的更改:

all中可省略axis=0
grouped==True可以省略==True

grouped=(namToViirs['nCldLayers']<=1).groupby(level='namldx').all()
grouped = grouped[grouped]
filterIndex = grouped.index
print (filterIndex)
Int64Index([601, 603], dtype='int64', name='namldx')

我认为更好的是首先按boolean indexing进行过滤,然后按groupby进行过滤,因为循环次数较少 - &gt;更好的表现。

答案 1 :(得分:0)

对于问题1,请参阅jezrael的回答。对于问题2,您可以将索引作为集合进行播放:

namToViirs.index[namToViirs.nCldLayers <= 1] \ 
          .difference(namToViirs.index[namToViirs.nCldLayers > 1])

答案 2 :(得分:0)

您可能对this answer感兴趣。

目前的实施有些过时,但它应该将您的陈述减少到:

filterIndex = ((namToViirs['nCldLayers']<=1)
                .groupby(namToViirs.index).all(axis=0)[W].index)

编辑:还可以看到this answer的类似方法,不需要外部组件,从而导致:

filterIndex = ((namToViirs['nCldLayers']<=1)
                .groupby(namToViirs.index).all(axis=0)[lambda x : x].index)

答案 3 :(得分:0)

另一个选择是使用.pipe()和一个应用所需过滤的函数。

例如:

filterIndex = ((namToViirs['nCldLayers']<=1)
                .groupby(namToViirs.index)
                .all(axis=0)
                .pipe(lambda s : s[s])
                .index)