Как получить подмножества dataframe с одинаковыми значениями в некоторых столбцах? - PullRequest
0 голосов
/ 17 февраля 2019

Я работаю над следующим фреймом данных:

   height  weight  shoe_size  age
0     175      70         40   30
1     175      75         39   41
2     175      69         40   33
3     176      71         40   35
4     178      81         41   27
5     169      73         38   49
6     170      65         39   30

и обнаружил эту расслабленную функциональную зависимость (RFD):

('weight': 2.0) ==> ('height': 1.0)

, что означает, что для каждой пары строк есть разница <= 2 </strong> по весу они будут иметь разницу <= 1 </strong> по высоте тоже.

Мне нужно найти все подмножества строк, по которым этот RFDудерживает и показывает тот, у которого больше строк.

В этом случае наилучшим (самым большим) подмножеством будет:

   height  weight  shoe_size  age
2     175      69         40   33
0     175      70         40   30
3     176      71         40   35

Как получить все такие подмножества из кадра данных или, по крайней мере,самое большое подмножество, для которого этот RFD содержит?

Обновление

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

Чтобы лучше объяснить, о чем я говорю, приведу пример подмножества, найденного сследующий RFD

('height': 1.0, 'age': 6.0) ==> ('weight': 4.0)

Subset

   height  weight  shoe_size  age
0     175      70         40   30
1     175      75         39   41
2     175      69         40   33
3     176      71         40   35

Это подмножество неверно, поскольку строки

   height  weight  shoe_size  age
0     175      70         40   30

и

   height  weight  shoe_size  age
1     175      75         39   41

имеют расстояние 11> 6 , на возрасте , а также на расстоянии 5> 4 на весе .

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

1 Ответ

0 голосов
/ 17 февраля 2019

Там может быть лучшее решение вашей проблемы.Я собираюсь показать, как найти ответ, используя теорию графов (а именно, модуль networkx).

import networkx as nx
import numpy as np

Начните с выделения столбцов, которые участвуют в вычислении RFD:

values = df[['height', 'weight']].values

Рассчитайте все возможные различия.Это операция O(N^2), которая может быть дорогостоящей с точки зрения времени и памяти.

dist = np.abs(values[:,None] - values)

Определите подходящие пары строк:

im = (dist[:,:,0] <= 1) & (dist[:,:,1] <= 2)

Используйте их в качестве матрицы смежности ипостроить график.Узлы графа представляют строки в исходном кадре данных.Узлы связаны, если соответствующие строки находятся в RFD:

G = nx.from_numpy_matrix(im)

Найти все клики в графе (подграфы, где любой узел связан напрямую с любым другим узлом).Сортируйте клики по размеру и выбирайте самые большие.Извлеките строки однофамильцев из исходного кадра данных:

df.loc[sorted(nx.clique.find_cliques(G), key=len)[-1],:]
#   height  weight  shoe_size  age
#0     175      70         40   30
#2     175      69         40   33
#3     176      71         40   35
...