【问题标题】:How to find values that occur specific number of times in Pandas Series?如何查找在 Pandas 系列中出现特定次数的值?
【发布时间】:2018-09-11 00:33:49
【问题描述】:

鉴于以下系列:

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

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

【问题讨论】:

    标签: python pandas counter series


    【解决方案1】:

    您的逻辑很好,您只是不应该重复最昂贵的部分,即计数。将其存储在变量中并重用。您可能也不需要检索底层 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 的复杂度。没有办法解决这个问题。

    一种替代方法,基于dictcollections.Counter,在按计数过滤时效率会降低。由于 NumPy 数组有效地存储在内存中,因此布尔过滤相对于字典迭代更有效。

    【讨论】:

    • 谢谢,所以没有现成的方法,比如where(value_counts() == 3。 (我搜索了文档但找不到因此决定在这里问..)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用loc

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

      【讨论】:

      【解决方案4】:

      你也可以使用.where:

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

      【讨论】:

      • 这就是我所缺少的,dropna。谢谢你。很有帮助。
      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 2022-12-12
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多