Похоже, у вас на самом деле есть две задачи:
- преобразование кадра данных pandas в словарь, показывающий соседей первого порядка
- преобразование этого словаря в словарь, показывающий соседей второго порядка
Для первого задания вы можете использовать функцию pandas to_dict
, чтобы преобразовать ваш фрейм данных в словарь словарей, а затем отфильтровать под-словари в соответствии с их значениями: 0,0 или 1,0.Используя ваш фрейм данных df
в качестве примера:
d = {}
for k, subdict in df.to_dict().items():
neighbours = []
for k2, value in subdict.items():
if value:
neighbours.append(k2)
d[k] = neighbours
Now d
- это словарь, содержащий соседей первого порядка для каждого ключа:
print(d)
{'A': ['C', 'G', 'K'],
'B': ['E', 'G', 'I'],
'C': ['A', 'D', 'H', 'J', 'K', 'L', 'M'],
'D': ['C', 'J', 'N'],
'E': ['B', 'G', 'I', 'K'],
'F': ['J', 'N'],
'G': ['A', 'B', 'E', 'K'],
'H': ['C', 'I', 'K', 'L'],
'I': ['B', 'E', 'H', 'K', 'L'],
'J': ['C', 'D', 'F', 'N', 'M'],
'K': ['A', 'C', 'E', 'G', 'H', 'I'],
'L': ['C', 'H', 'I', 'M'],
'N': ['D', 'F', 'J'],
'M': ['C', 'J', 'L']}
Чтобы преобразовать это впокажите также соседей второго порядка, вам нужно перебрать значения для каждого ключа, найти соседей для каждого значения и добавить их в исходный список значений.
def find_second_order_neighbours(d):
d2 = {}
for k, neighbours in d.items(): # loop over the dictionary
new_neighbours = set(neighbours) # create a temporary set to store all second order neighbours
for neighbour in neighbours: # loop over the original neighbours
new_neighbours = (new_neighbours | set(d[neighbour])) - {k} # add all second order neighbours ignoring duplicates (and making sure k is not its own neighbour)
d2[k] = list(new_neighbours) # update the dictionary to return
return d2
print(find_second_order_neighbours(d))
{'A': ['E', 'K', 'G', 'C', 'L', 'J', 'I', 'H', 'M', 'D', 'B'],
'B': ['E', 'G', 'K', 'L', 'A', 'I', 'H'],
'C': ['N', 'E', 'K', 'G', 'L', 'A', 'J', 'I', 'H', 'M', 'F', 'D'],
'D': ['N', 'K', 'C', 'L', 'A', 'J', 'H', 'M', 'F'],
'E': ['K', 'G', 'C', 'L', 'A', 'I', 'H', 'B'],
'F': ['N', 'C', 'J', 'M', 'D'],
'G': ['E', 'K', 'C', 'A', 'I', 'H', 'B'],
'H': ['E', 'K', 'G', 'C', 'L', 'A', 'J', 'I', 'M', 'D', 'B'],
'I': ['E', 'K', 'G', 'C', 'L', 'A', 'H', 'M', 'B'],
'J': ['N', 'K', 'C', 'L', 'A', 'H', 'M', 'F', 'D'],
'K': ['E', 'G', 'C', 'L', 'A', 'J', 'I', 'H', 'M', 'D', 'B'],
'L': ['E', 'K', 'C', 'A', 'J', 'I', 'H', 'M', 'D', 'B'],
'N': ['C', 'J', 'M', 'F', 'D'],
'M': ['N', 'K', 'C', 'L', 'A', 'J', 'I', 'H', 'D', 'F']}
EXTRA
Если вас интересуют не только соседи второго порядка (третий, четвертый и т. Д.), Вы можете повторно вызывать функцию find_second_order_neighbours
, чтобы найти соседа n
порядка следующим образом:
def find_n_order_neighbours(n, d):
while n > 1:
d = find_second_order_neighbours(d)
n -= 1
return d