Python:如何找到最常见的元素组合?

5
一台机器生成故障代码,这些代码以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](3次), [2,5](3次), [3,5](2次)等。

如何实现这一点?由于数据很多,因此我正在寻找一种高效的解决方案。

以下是另外两种表示数据的方式(以防这有助于计算):

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

enter image description here

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

enter image description here


顺序很重要吗?[2,5][5,2]不同吗? - sophros
顺序不重要;[2,5] 等同于 [5,2] - Julian
1个回答

6
使用自定义函数 all_subsets,然后使用Series.explode展开值,最后使用Series.value_counts统计计数:
from itertools import chain, combinations

#https://dev59.com/QnRB5IYBdhLWcg3w7riV#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
@Julian - 我为元组列表创建了所有可能的组合,因此添加了explode以便通过value_counts进行计数。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接