我在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
Run Code Online (Sandbox Code Playgroud)
现在假设我想从列"mi"中获得出现超过2次的所有值,结果应该是
>>> <fancy query>
array([1])
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用groupby和count的一些东西但是我总是最终得到一个包含值及其各自计数的系列但不知道如何从中提取计数超过X的值:
>>> df2.groupby('mi').mi.count() > 2
mi
1 True
2 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
但是我现在如何使用它来获得真实的mi值?
任何提示赞赏:)
nic*_*ten 12
我用这个:
df2.mi.value_counts().reset_index(name="count").query("count > 5")["index"]
Run Code Online (Sandbox Code Playgroud)
之前的部分query()给了我一个包含两列的数据框:index和count。该query()过滤器上count,然后我们拉出值。
jun*_*er- 11
或者这个怎么样:
创建表:
>>> import pandas as pd
>>> df2 = pd.DataFrame([{"uid": 0, "mi":1}, {"uid": 0, "mi":2}, {"uid": 0, "mi":1}, {"uid": 0, "mi":1}])
Run Code Online (Sandbox Code Playgroud)
获取每次出现的计数:
>>> vc = df2.mi.value_counts()
>>> print vc
1 3
2 1
Run Code Online (Sandbox Code Playgroud)
打印出超过2次的那些:
>>> print vc[vc > 2].index[0]
1
Run Code Online (Sandbox Code Playgroud)
类似于@nicolaskruchten,略短的版本
df2.mi.value_counts().loc[lambda x: x>5].reset_index()['index']
Run Code Online (Sandbox Code Playgroud)
如果您不需要在系列中获得结果,只需执行以下操作:
df2.mi.value_counts().loc[lambda x: x>5].index
Run Code Online (Sandbox Code Playgroud)
我发现@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
Run Code Online (Sandbox Code Playgroud)
假设我们想要找到多次出现的年份:
>>>vc[vc>1]
1991 3
1992 2
Name: YOB, dtype: int64
Run Code Online (Sandbox Code Playgroud)
如果我们现在想要访问实际值,我们需要这样做:
>>>vc[vc>1].index.tolist()
[1991,1992]
Run Code Online (Sandbox Code Playgroud)
而不是通过索引调用它,它只会打印出第一个值:
>>>vc[vc>1].index[0]
1991
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20054 次 |
| 最近记录: |