我有一个pandas数据框,其中包含具有一对多关系的索引。我的数据的一个非常简化和缩短的示例显示在DataFrame Example链接中。我想获得nCldLayers< = 1的唯一namIdx值的列表或系列或ndarray。最终结果应显示601和603的索引。
我可以通过下面的3条陈述来实现这一目标,但我想知道是否有一个更好,更简洁的方式可能是'过滤器'选择&#39 ;或者'其中'。
grouped=(namToViirs['nCldLayers']<=1).groupby(namToViirs.index).all(axis=0)
grouped = grouped[grouped==True]
filterIndex = grouped.index
通过在链的后续部分应用逻辑条件(namToViirs [&#39; nCldLayers&gt; = 1],是否有更好的方法来完成此结果,即第一组然后应用逻辑条件,然后只检索该组中每个成员的逻辑结果为真的namIdx?
答案 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)