Python - 如何按照频率检查数字组合

3

让我们举一个例子来说明以下数据。

 h: [Num1, Num2, Num3, Num4, Num5, Num6]
 a: [1,       2,    3,    4,    5,    6]
 b: [1,       2,    7,    8,    9,   10]
 c: [1,       2,    3,    6,    8,   10]

现在,假设我想按频率查看以2+为单位的组合。

让我们以数字1为例,它出现在我们三行a,b,c中的所有行中。

当1被“使用”时,通常会与2配对(3/3),接着是3、6、8、10(2/3)。 换句话说,当1被“使用”时,有可能会出现以下情况:

 [1, 2, x, y, z, t]
 [1, 2, 3, x, y, z]
 [1, 2, 6, x, y, z]
 .
 .
 .
 [1, 8, x, y, z, t]
 [1, 10, x, y, z, t]
 [1, 2, 3, 6, 8, 10]

顺序不重要,x、y、z和t可以是任何给定的数。不允许出现/允许复制品。

我有一个数据框架,其格式如上所示,并想知道与44组合的其他整数是什么。

例如:

 44 was paired with 11, 350 times out of 2000
 44 was paired with 27, 290 times out of 2000
 44 was paired with 35, 180 times out of 2000
 .
 .
 .
 44 was paired with 2, 5 times out of 2000

我有每列中每个数字出现的频率,但我不知道如何继续处理。
期待您的想法和问题。 谢谢!

嗨,也许您可以上传一个更大的样本,这样我们就可以测试我们将要提出的建议。 - Setop
你好,如果我把它粘贴到pastebin上,对你有用吗?我不太熟悉如何在这里分享东西。https://pastebin.com/WMY0umMF。 - Andrei
你能指明你的数据在什么格式中吗?是pandas数据框、字典、numpy数组还是其他格式? - anon01
@anon01,Pandas 数据框。 - Andrei
1个回答

1
你可以使用 itertools 模块中的 Counter
from itertools import combinations
from collections import Counter
data = [[1, 2, 3],[1, 2, 5],[1, 3, 8],[2, 5, 8]]
pairings = Counter(
    pair for row in data 
    for pair in combinations(sorted(row), 2)
)

计数器对象类似于字典。
Counter({
    (1, 2): 2, 
    (1, 3): 2, 
    (2, 5): 2, 
    (2, 3): 1, 
    (1, 5): 1, 
    (1, 8): 1, 
    (3, 8): 1, 
    (2, 8): 1, 
    (5, 8): 1
})

您可以通过以下方式获取特定对的计数:
>>> pairings[1,2] 
2

嗨,这太棒了!我将我的数据框值转换成列表,使用 Counter 然后使用 most_common 得到了前几个结果。谢谢! - Andrei

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