如何将在同一列中至少共享一个“1”的所有标签(索引)分组?

2024-04-26 00:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

分组规则:

  • 在同一列中至少有一个“1”
  • 共享任意数量的公用行(参见示例)

例如:

   c0  c1  c2  c3
A   1   0   0   1
B   0   0   1   0
C   0   0   0   1
D   0   1   1   0
E   0   1   0   0

预期产量:

[[A, C], [B, D, E]]

如您所见,B和E在列中不共享“1”,但它们有共同的“D”,因此所有3个都应该分组


Tags: 示例数量规则公用产量c2c1c3
2条回答

下面是networkx的一个解决方案。你知道吗

import networkx as nx
a = np.where(df.T, df.index, '').sum(axis=1)
g = [list(x) for x in a if len(x) > 1]
G = nx.Graph(g)
list(nx.connected_components(G))

[{'B', 'D', 'E'}, {'A', 'C'}]

这可以实现您想要的:

import numpy as np
from itertools import combinations 
import networkx as nx

df
"""output:  
   1  2  3  4
0            
A  1  0  0  1
B  0  0  1  0
C  0  0  0  1
D  0  1  1  0
E  0  1  0  0
"""

df.index.tolist()
"""output:
['A', 'B', 'C', 'D', 'E']
"""
list(combinations(df.index.tolist(),2))

"""output : 
[('A', 'B'),
 ('A', 'C'),
 ('A', 'D'),
 ('A', 'E'),
 ('B', 'C'),
 ('B', 'D'),
 ('B', 'E'),
 ('C', 'D'),
 ('C', 'E'),
 ('D', 'E')]
"""
results = [x for x in list(combinations(df.index.tolist(),2)) if np.sum(df.loc[x[0],:].multiply(df.loc[x[1],:])) > 0]

results
"""output: 
[('A', 'C'), ('B', 'D'), ('D', 'E')]
"""
list(nx.connected_components(nx.Graph(results)))
"""output: 
[{'A', 'C'}, {'B', 'D', 'E'}]
"""

相关问题 更多 >