Pandas:从列中获取超过X次的值

时间:2014-03-11 08:39:37

标签: python pandas

我在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值?

任何提示赞赏:)

5 个答案:

答案 0 :(得分:8)

或者这个怎​​么样:

创建表格:

>>> 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

答案 1 :(得分:5)

类似于@nicolaskruchten,版本略短

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

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

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

答案 2 :(得分: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

答案 3 :(得分:2)

我用这个:

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

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

答案 4 :(得分:1)

from collections import Counter

counts = Counter(df2.mi)
df2[df2.mi.isin([key for key in counts if counts[key] > 2])]