Pandas:获取出现超过X次的列值
我在使用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 个回答
1
from collections import Counter
counts = Counter(df2.mi)
df2[df2.mi.isin([key for key in counts if counts[key] > 2])]
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
9
我发现@juniper提供的解决方案有个问题——如果有超过两个的值满足你的条件,它们就不会被打印出来。举个例子:
>>> 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
18
我用的是这个:
df2.mi.value_counts().reset_index(name="count").query("count > 5")["index"]
在query()
之前的部分会给我一个数据框,这个数据框有两列:index
和count
。然后query()
会根据count
进行筛选,最后我们提取出这些值。
21
和@nicolaskruchten说的差不多,这个版本稍微短一些。
df2.mi.value_counts().loc[lambda x: x>5].reset_index()['index']
如果你不需要把结果放在一个系列里,那就直接这样做:
df2.mi.value_counts().loc[lambda x: x>5].index
34
或者这样做:
首先,创建一个表格:
>>> 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
最后,打印出那些出现超过两次的内容:
>>> print vc[vc > 2].index[0]
1