我在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值?
任何提示赞赏:)
答案 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()
之前的部分为我提供了一个包含两列的数据框:index
和count
。 query()
上的count
过滤器,然后我们提取值。
答案 4 :(得分:1)
from collections import Counter
counts = Counter(df2.mi)
df2[df2.mi.isin([key for key in counts if counts[key] > 2])]