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