【问题标题】:Pandas: Get values from column that appear more than X timesPandas:从出现超过 X 次的列中获取值
【发布时间】:2014-03-11 08:39:36
【问题描述】:

我在 pandas 中有一个数据框,想获取某个列中出现超过 X 次的所有值。我知道这应该很容易,但不知何故,我目前的尝试并没有取得任何进展。

这是一个例子:

>>> df2 = pd.DataFrame([{"uid": 0, "mi":1}, {"uid": 0, "mi":2}, {"uid": 0, "mi":1}, {"uid": 0, "mi":1}])
>>> df2

    mi  uid
0    1   0
1    2   0
2    1   0
3    1   0

现在假设我想从“mi”列中获取出现超过 2 次的所有值,结果应该是

>>> <fancy query>
array([1])

我已经尝试了一些关于 groupby 和 count 的事情,但我总是以一系列的值和它们各自的计数结束,但不知道如何从中提取计数超过 X 的值:

>>> df2.groupby('mi').mi.count() > 2
mi
1      True
2     False
dtype: bool

但是我现在如何使用它来获得 mi 的真实值?

任何提示表示赞赏:)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    类似于@nicolaskruchten,版本略短

     df2.mi.value_counts().loc[lambda x: x>5].reset_index()['index']
    

    如果您不需要在意甲中获得结果,只需执行以下操作:

    df2.mi.value_counts().loc[lambda x: x>5].index
    

    【讨论】:

    • 优秀。我已经看了 4 年了。
    • 这是一个了不起的解决方案,使用 locvalue_counts()
    【解决方案2】:

    或者这个怎​​么样:

    创建表:

    >>> import pandas as pd
    >>> df2 = pd.DataFrame([{"uid": 0, "mi":1}, {"uid": 0, "mi":2}, {"uid": 0, "mi":1}, {"uid": 0, "mi":1}])
    

    获取每次出现的次数:

    >>> vc = df2.mi.value_counts()
    >>> print vc
    1    3
    2    1
    

    打印出出现超过 2 次的那些:

    >>> print vc[vc > 2].index[0]
    1
    

    【讨论】:

    • 很酷!我猜这不是最优雅的方式,因为它返回一个索引,但如果我将选择包装在np.array 中,它就可以完成工作:np.array(vc[vc &gt; 2].index)。谢谢!
    • 无需新建数组,索引对象持有数组,vc[vc > 2].index.values返回array([1])
    • 注意:值value_countscounts()慢得多
    • 这个解决方案只打印出索引中指定的第一个元素。如果有多个值满足条件,则不会打印出来!
    • 有没有更实用的方式。 vc = df2.mi.value_counts(); vc[vc &gt; 2] 无需定义单独的vc 变量?
    【解决方案3】:

    我发现@juniper 提供的解决方案有问题- 如果有超过 2 个值满足您的条件,它们将不会被打印出来。例如:

    >>> check=pd.DataFrame({'YOB':[1991,1992,1993,1991,1995,1994,1992,1991]})
    
    >>>vc = check.YOB.value_counts()
    >>>vc
    1991    3
    1992    2
    1995    1
    1994    1
    1993    1
    Name: YOB, dtype: int64
    

    假设我们要查找多次出现的年份:

    >>>vc[vc>1]
    1991    3
    1992    2
    Name: YOB, dtype: int64
    

    如果我们现在想要访问实际值,我们需要这样做:

    >>>vc[vc>1].index.tolist()
    [1991,1992]
    

    而不是通过索引调用它,它只会打印出第一个值:

    >>>vc[vc>1].index[0]
    1991
    

    【讨论】:

    • 不错的矢量化解决方案。
    【解决方案4】:

    我用这个:

     df2.mi.value_counts().reset_index(name="count").query("count > 5")["index"]
    

    query() 之前的部分给了我一个包含两列的数据框:indexcountquery() 过滤 count,然后我们提取值。

    【讨论】:

    • 这是最快最好的答案!!
    • 不错的一个。看看我的回答,你可能也会感兴趣:) @nicolaskruchten
    【解决方案5】:
    from collections import Counter
    
    counts = Counter(df2.mi)
    df2[df2.mi.isin([key for key in counts if counts[key] > 2])]
    

    【讨论】:

      猜你喜欢
      • 2022-11-28
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2021-04-06
      • 2021-08-26
      相关资源
      最近更新 更多