如何获取Python中每个标记出现频率最高的类别(模式)?
+------------------+----------+
| 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 |
+-----------------------------+预期输出将如下所示
tag | category
------------+-----------
ba | 8
automotive | 8
bananatree | 8
bath | 9
bamboo | 8 由于我的数据集的机密性,我借用了Stephen J. Fuhry的表格,并在MySQL SELECT most frequent by group上编辑了David Fuhry的输出。
发布于 2014-05-16 12:59:13
在注释中,您注意到您使用的是pandas。您可以执行以下操作:
>>> 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方法来完成此操作:
>>> 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有两个条目(所有其他数据都相同):
tag|category
bath|9
bath|10在这种情况下,输出将是:
>>> 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按降序排列,因此您希望获取第一行的索引:
>>> df.groupby('tag')['category'].agg(lambda x: x.value_counts().index[0])
tag
automotive 8
ba 8
bamboo 8
banana tree 8
bath 9但是,在多模式情况下,这不会返回数组。它将只返回第一个模式。
https://stackoverflow.com/questions/23692419
复制相似问题