代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

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

  •  3
  • Koray Tugay  · 技术社区  · 7 年前

    给出以下系列:

    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 回复  |  直到 7 年前
        1
  •  3
  •   jpp    7 年前

    你的逻辑很好,你不应该重复最昂贵的部分,那就是计数。将其存储在变量中并重新使用。您可能也不需要检索基础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 基于 collections.Counter ,在按计数过滤时效率会降低。由于numpy数组有效地存储在内存中,布尔过滤相对于字典迭代是有效的。

        2
  •  2
  •   sacuL    7 年前

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

    sr.groupby(sr).filter(lambda x: len(x) == 3).unique()
    #array([5, 6, 8])
    
        3
  •  2
  •   BENY    7 年前

    使用 loc

    sr.value_counts().loc[lambda x : x==3].index
    Out[162]: Int64Index([8, 6, 5], dtype='int64')
    
        4
  •  1
  •   Abhi    7 年前

    你也可以用 .where :

    sr.where(sr.value_counts()==3).dropna().index
    
    # Output:
    Int64Index([5, 6, 8], dtype='int64')