首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用group by选择最常用

Python:使用group by选择最常用
EN

Stack Overflow用户
提问于 2014-05-16 12:00:15
回答 1查看 9.7K关注 0票数 6

如何获取Python中每个标记出现频率最高的类别(模式)?

代码语言:javascript
复制
+------------------+----------+
| tag              | category |
+------------------+----------+
| automotive       |        8 |
| ba               |        8 |
| bamboo           |        8 |
| bamboo           |        8 |
| bamboo           |        8 |
| bamboo           |        8 |
| bamboo           |        8 |
| bamboo           |       10 |
| bamboo           |        8 |
| bamboo           |        9 |
| bamboo           |        8 |
| bamboo           |       10 |
| bamboo           |        8 |
| bamboo           |        9 |
| bamboo           |        8 |
| banana tree      |        8 |
| banana tree      |        8 |
| banana tree      |        8 |
| banana tree      |        8 |
| bath             |        9 |
+-----------------------------+

预期输出将如下所示

代码语言:javascript
复制
    tag     | category 
------------+-----------
 ba         |        8      
 automotive |        8      
 bananatree |        8        
 bath       |        9    
 bamboo     |        8 

由于我的数据集的机密性,我借用了Stephen J. Fuhry的表格,并在MySQL SELECT most frequent by group上编辑了David Fuhry的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-16 12:59:13

在注释中,您注意到您使用的是pandas。您可以执行以下操作:

代码语言:javascript
复制
>>> df

           tag  category
0    automotive         8
1            ba         8
2        bamboo         8
3        bamboo         8
4        bamboo         8
5        bamboo         8
6        bamboo         8
7        bamboo        10
8        bamboo         8
9        bamboo         9
10       bamboo         8
11       bamboo        10
12       bamboo         8
13       bamboo         9
14       bamboo         8
15  banana tree         8
16  banana tree         8
17  banana tree         8
18  banana tree         8
19         bath         9

在‘groupby’列的'tag‘上执行一个标签,然后在每个组中使用mode方法。然而,我们必须将其设为条件,因为如果观察值的数量小于3,pandas不会返回mode的数字(在组中有1个或2个观察值的特殊情况下,我们可以只返回组本身)。我们可以使用带有lambda函数的aggregate/agg方法来完成此操作:

代码语言:javascript
复制
>>> mode = lambda x: x.mode() if len(x) > 2 else np.array(x)
>>> df.groupby('tag')['category'].agg(mode)

tag
automotive     8
ba             8
bamboo         8
banana tree    8
bath           9

注意,当模式是多模式时,你会得到一个数组(numpy)。例如,假设bath有两个条目(所有其他数据都相同):

代码语言:javascript
复制
tag|category
bath|9
bath|10

在这种情况下,输出将是:

代码语言:javascript
复制
>>> mode = lambda x: x.mode() if len(x) > 2 else np.array(x)
>>> df.groupby('tag')['category'].agg(mode)

tag
automotive           8
ba                   8
bamboo               8
banana tree          8
bath           [9, 10]

您也可以使用value_counts方法代替mode。再次,对‘groupby’列的'tag‘执行一次标记,然后在每个组中使用value_counts方法。value_counts按降序排列,因此您希望获取第一行的索引:

代码语言:javascript
复制
>>> df.groupby('tag')['category'].agg(lambda x: x.value_counts().index[0])

tag
automotive     8
ba             8
bamboo         8
banana tree    8
bath           9

但是,在多模式情况下,这不会返回数组。它将只返回第一个模式。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23692419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档