我在不同的配对变量中运行了多矛符相关性,发现这些列最相关。我想在这些相关性e.g. [col_147,col_141,col_319]
中找到成对的组,其中可能彼此完全配对。
array([list(['col_165', 'col_184']), list(['col_147', 'col_319']),
list(['col_141', 'col_319']), list(['col_142', 'col_148']),
list(['col_312', 'col_316']), list(['col_141', 'col_316']),
list(['col_147', 'col_316']), list(['col_316', 'col_319']),
list(['col_141', 'col_312']), list(['col_147', 'col_312']),
list(['col_312', 'col_319']), list(['col_314', 'col_318']),
list(['col_141', 'col_142']), list(['col_142', 'col_147']),
list(['col_147', 'col_148']), list(['col_141', 'col_148']),
list(['col_142', 'col_319']), list(['col_311', 'col_317']),
list(['col_148', 'col_319']), list(['col_142', 'col_316']),
list(['col_148', 'col_316']), list(['col_142', 'col_312']),
list(['col_148', 'col_312']), list(['col_313', 'col_317']),
list(['col_313', 'col_315']), list(['col_149', 'col_316']),
list(['col_149', 'col_312']), list(['col_143', 'col_147']),
list(['col_141', 'col_143']), list(['col_143', 'col_319']),
list(['col_143', 'col_148']), list(['col_23', 'col_25']),
list(['col_149', 'col_319']), list(['col_141', 'col_149']),
list(['col_147', 'col_149']), list(['col_311', 'col_313']),
list(['col_143', 'col_315']), list(['col_149', 'col_311']),
list(['col_142', 'col_149']), list(['col_142', 'col_143']),
list(['col_143', 'col_316']), list(['col_143', 'col_312']),
list(['col_143', 'col_317']), list(['col_148', 'col_149']),
list(['col_315', 'col_317']), list(['col_149', 'col_313']),
list(['col_151', 'col_48']), list(['col_145', 'col_151']),
list(['col_145', 'col_170']), list(['col_170', 'col_48']),
list(['col_145', 'col_189']), list(['col_189', 'col_48']),
list(['col_148', 'col_318']), list(['col_145', 'col_18']),
list(['col_18', 'col_48']), list(['col_142', 'col_318']),
list(['col_188', 'col_312']), list(['col_187', 'col_312']),
list(['col_169', 'col_312']), list(['col_168', 'col_312']),
list(['col_170', 'col_245']), list(['col_189', 'col_245']),
list(['col_151', 'col_245']), list(['col_143', 'col_313']),
list(['col_149', 'col_317']), list(['col_188', 'col_316']),
list(['col_187', 'col_316']), list(['col_169', 'col_316']),
list(['col_168', 'col_316']), list(['col_145', 'col_245']),
list(['col_245', 'col_48']), list(['col_184', 'col_76']),
list(['col_184', 'col_75']), list(['col_165', 'col_76']),
list(['col_165', 'col_75']), list(['col_187', 'col_314']),
list(['col_188', 'col_314']), list(['col_169', 'col_314']),
list(['col_168', 'col_314']), list(['col_148', 'col_314']),
list(['col_141', 'col_188']), list(['col_141', 'col_187']),
list(['col_147', 'col_188']), list(['col_147', 'col_187']),
list(['col_141', 'col_169']), list(['col_141', 'col_168']),
list(['col_147', 'col_169']), list(['col_147', 'col_168'])],
dtype=object)
首先想到的是找到唯一的值,在找到匹配项之前循环这些值,然后查看匹配的唯一值,直到找到与这些值匹配的值,依此类推。但我确信有一种更简单的方法。
答案 0 :(得分:1)
试试这个:
def find_groups(pairs):
groups_list = list()
for pair in pairs:
s = ab = set(pair)
for t in groups_list[:]: # we need to use copy
if t & ab: # check t include a, b
s |= t
groups_list.remove(t)
groups_list.append(s) # only s include a, b
return groups_list
find_groups(pairs)
答案 1 :(得分:1)
免责声明:我不确定我是否理解正确。
在您的示例[col_147,col_141,col_319]
中应该配对,但我找不到col_147
和col_141
因此,如果与col_319
的共享连接已足以进行分组,则以下代码是错误的。
另一方面,如果你正在寻找团体,每个项目都与彼此的项目有直接联系,那么你就是:
from collections import defaultdict
connections = defaultdict(set)
for pair in array:
connections[pair[0]].update(pair)
connections[pair[1]].update(pair)
groups = set()
for others in connections.values():
relations = [others] + [connections[o] for o in others]
intersection = set.intersection(*relations)
if len(intersection) > 2:
groups.add(frozenset(intersection))
for group in groups:
print(group)
输出:
frozenset({'col_312', 'col_142', 'col_319', 'col_148', 'col_316'})
frozenset({'col_76', 'col_184', 'col_165'})
frozenset({'col_312', 'col_316', 'col_141'})
frozenset({'col_149', 'col_317', 'col_311', 'col_313'})
frozenset({'col_165', 'col_75', 'col_184'})
frozenset({'col_315', 'col_313', 'col_317', 'col_143'})
frozenset({'col_312', 'col_147', 'col_316'})