Подобно этому ответу , вы можете сделать каждый необработанный фрейм данных путем и искать подключенные компоненты . Я добавил строку без общих значений с любыми другими строками, чтобы лучше проиллюстрировать, как это работает:
print(df)
0 1 2 3
0 a ❤ ? ?
1 b ❤ ? ?
2 c ? ? ?
3 d ? ✨ ?
4 e ❤ ? ?
5 f ? ? ?
Итак, перебираем строки фрейма данных и добавляем их как пути с nx.add_path
:
my_list = df.values.tolist()
G=nx.Graph()
for path in my_list:
nx.add_path(G, path)
components = list(nx.connected_components(G))
print(components)
[{'a', 'b', 'c', 'd', 'e', '✨', '❤', '?', '?', '?', '?', '?'},
{'f', '?', '?', '?'}]
Теперь вы можете перемещаться по группам и добавлять каждую строку в новый подсписок во вложенном списке, если это подмножество компонента:
groups = []
for component in components:
group = []
for path in my_list:
if component.issuperset(path):
group.append(path)
groups.append(group)
В этом случае все строки, кроме последней, сгруппированы вместе, а последняя - в другой группе.
print(groups)
[[['a', '❤', '?', '?'],
['b', '❤', '?', '?'],
['c', '?', '?', '?'],
['d', '?', '✨', '?'],
['e', '❤', '?', '?']],
[['f', '?', '?', '?']]]