Python:如何找到最频繁的元素组合?

Posted

技术标签:

【中文标题】Python:如何找到最频繁的元素组合?【英文标题】:Python: How to find most frequent combination of elements? 【发布时间】:2021-01-13 20:24:16 【问题描述】:

一台机器提供在 pandas 数据框中提供的故障代码。 id识别机器,code为故障码:

df = pd.DataFrame(
    "id": [1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,4],
    "code": [1,2,5,8,9,2,3,5,6,1,2,3,4,5,6,7],
)

读取示例:机器 1 生成 5 个代码:1、2、5、8 和 9。

我想找出哪些代码组合在所有机器中最常见。该示例的结果将类似于[2](3x)、[2,5](3x)、[3,5](2x) 等等。

我怎样才能做到这一点?由于数据很多,我正在寻找一个有效的解决方案。

这里有另外两种表示数据的方法(以防计算更容易):

pd.crosstab(df.id, df.code)

df.groupby("id")["code"].apply(list)

【问题讨论】:

订购重要吗? [2, 5][5,2] 不同吗? 排序无关紧要; [2,5] 等于 [5,2] 【参考方案1】:

使用自定义函数all_subsets,然后将值平展Series.explode,最后使用Series.value_counts

from itertools import chain, combinations

#https://***.com/a/5898031
#only converted to list and removed empty tuples by range(1,...
def all_subsets(ss):
    return list(chain(*map(lambda x: combinations(ss, x), range(1, len(ss)+1))))

s = df.groupby('id')['code'].apply(all_subsets).explode().value_counts()
print (s)
(2,)            3
(2, 5)          3
(5,)            3
(1, 2)          2
(3, 6)          2
               ..
(1, 5, 8)       1
(9,)            1
(1, 3, 4, 6)    1
(5, 8, 9)       1
(4, 6)          1

【讨论】:

太好了,谢谢!您介意详细说明一下您的代码吗? @Julian - 我为元组列表创建了所有可能的组组合,因此为元组列表添加了explode,以便可能按value_counts计算它

以上是关于Python:如何找到最频繁的元素组合?的主要内容,如果未能解决你的问题,请参考以下文章

python面试题-找到两个数组元素和小于等于目标值target的最大值的所有组合

Python3教程之列表

在python中组合n个列表的所有元素[关闭]

查找最频繁的元素并排序数据

如何使用分而治之以及如果一个子阵列占多数,组合阵列占多数以找到多数元素的事实?

python中L组K项中N个元素的组合