【问题标题】:Python: select most frequent using group by [duplicate]Python:通过[重复]选择最常用的组
【发布时间】:2014-07-04 17:42:25
【问题描述】:

如何获取 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 的输出。

【问题讨论】:

  • 你想用 MySQL 做那个吗?
  • 如果您可以将该处理推送到 SQL 服务器,我会这样做,而不是将大量数据推送到您需要筛选的程序(不管它是用什么写的)通过。因此,我建议这是一个 MySQL 问题,而不是 Python。
  • 你从什么样的对象开始?如果你设置在 sql 上,sqlite3 是一个本机包,可以处理内存中的数据库函数(使用 ':memory:' 表)。
  • @Nick T 我正在使用 Pandas 和 sk learn 对我的数据集进行数据分析。在一天结束时,无论如何,我仍然必须让我的机器将整个数据集加载到我的内存中。
  • @ DrBailey 恐怕这可能行不通,因为我有 CSV 文件开始并由 Pandas 加载到数据框中。

标签: python pandas


【解决方案1】:

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

>>> 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,然后在每个组中使用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)。例如,假设浴有两个条目(所有其他数据都相同):

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,然后在每个组中使用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

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

【讨论】:

  • 谢谢。太棒了。
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 2021-01-27
  • 2017-08-11
  • 2015-05-30
  • 2015-04-23
  • 2011-10-09
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多