Группируйте строки фрейма данных с общими значениями - PullRequest
1 голос
/ 20 июня 2020

У меня есть следующий набор данных:

    0   1   2   3
0   a   ❤   ?  ?
1   b   ❤   ?  ?
2   c   ?  ?  ?
3   d   ?  ✨   ?
4   e   ❤   ?  ?

Я хотел бы выполнить кластеризацию, чтобы сгруппировать ROWS, которые имеют что-то общее.

Используя networkx в следующем коде, это результат:

import networkx as nx
import matplotlib.pyplot as plt

G=nx.from_pandas_edgelist(df, 0, 1)
nx.draw(G, with_labels=True)
plt.show()

вывод: группы, полученные с помощью networkx

Как я могу также рассмотреть столбцы 2 и 3? Могу ли я сделать это, не отдавая приоритет какому-либо конкретному столбцу (например, я хочу, чтобы столбец 2 был так же важен, как и столбец 1)?

1 Ответ

1 голос
/ 20 июня 2020

Подобно этому ответу , вы можете сделать каждый необработанный фрейм данных путем и искать подключенные компоненты . Я добавил строку без общих значений с любыми другими строками, чтобы лучше проиллюстрировать, как это работает:

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', '?', '?', '?']]]
...