Pandas:获取出现超过X次的列值

42 投票
5 回答
69734 浏览
提问于 2025-04-17 21:45

我在使用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()之前的部分会给我一个数据框,这个数据框有两列:indexcount。然后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

撰写回答