Python:按组选择最常用的

Python:按组选择最常用的,python,pandas,Python,Pandas,如何为Python中的每个标记获取最频繁出现的类别(模式) +------------------+----------+ | tag | category | +------------------+----------+ | automotive | 8 | | ba | 8 | | bamboo | 8 | | bamboo |

如何为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那里借用了表,并在上编辑了David Fuhry的输出。

在您注意到的评论中,您使用的是
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
,然后在每个组内使用
模式
方法。但是,我们必须将其设置为有条件的,因为如果观察次数少于3次,则
pandas
不会返回
模式的数字(在一个组中有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有两个条目(所有其他数据都相同):

在这种情况下,输出为:

>>> 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\u counts
方法代替
模式
。再次对“类别”列的“标记”执行
groupby
,然后在每个组内使用
value\u counts
方法<代码>值\u计数
按降序排列,因此您希望获取第一行的索引:

>>> df.groupby('tag')['category'].agg(lambda x: x.value_counts().index[0])

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

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

您想使用MySQL进行此操作吗?如果您可以将此处理推送到SQL server,我会这样做,而不是让它将大量数据推送到您需要筛选的程序中(无论用什么编写)。因此,我建议这是一个MySQL问题,而不是Python问题。您从什么类型的对象开始?如果设置为sql,sqlite3是一个本机包,可以在内存中处理数据库函数(使用“:memory:”表)。@Nick T我正在使用Pandas和sk learn对我的数据集进行数据分析。无论如何,在一天结束时,我仍然必须让我的机器将整个数据集加载到我的内存中。@DrBailey我担心这可能行不通,因为我有CSV文件要开始,并由Pandas加载到数据框中。谢谢。太棒了。
>>> df.groupby('tag')['category'].agg(lambda x: x.value_counts().index[0])

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