如何找到在熊猫系列中出现特定次数的值?

时间:2018-09-11 00:33:50

标签: python pandas counter series

给出以下系列:

sr = pd.Series([5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8])

我想查找出现3次的值。这是我的解决方案,似乎可行,但看起来很奇怪:

(sr.value_counts() == 3)[sr.value_counts() == 3].index.values

我还有其他/明显的方法吗?

4 个答案:

答案 0 :(得分:3)

您的逻辑很好,您不应该重复最昂贵的部分,即计数。将其存储在变量中并重复使用。您可能也不需要检索基础的NumPy数组,pd.Index对象通常就足够了:

sr = pd.Series([5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8])

counts = sr.value_counts()

res = counts[counts == 3].index
# Int64Index([8, 6, 5], dtype='int64')

对于任何解决方案都没有现成方法的原因将需要最小O( n )时间复杂度,这就是value_counts的复杂度。没办法解决这个问题。

一种基于dict的{​​{1}}替代方法在按计数进行过滤时效率较低。由于NumPy数组有效地存储在内存中,因此布尔过滤相对于字典迭代是有效的。

答案 1 :(得分:2)

@jpp的答案可能是您应该选择的答案,但这是一个奇怪的选择(只是为了好玩):

sr.groupby(sr).filter(lambda x: len(x) == 3).unique()
#array([5, 6, 8])

答案 2 :(得分:2)

使用loc

sr.value_counts().loc[lambda x : x==3].index
Out[162]: Int64Index([8, 6, 5], dtype='int64')

答案 3 :(得分:1)

您也可以使用.where

sr.where(sr.value_counts()==3).dropna().index

# Output:
Int64Index([5, 6, 8], dtype='int64')