эффективный способ получить список смежности сети? - PullRequest
0 голосов
/ 12 ноября 2018

Рассмотрим этот простой пример

pd.DataFrame({'id' : [1,1,2,3,4],
              'place' : ['bar','pool','bar','kitchen','bar']})

Out[4]: 
   id    place
0   1      bar
1   1     pool
2   2      bar
3   3  kitchen
4   4      bar

Здесь структура сети такова, что данный id связан с другим id, если они отправились в то же место.

Например, здесь 1 подключено к 2 и 4, потому что они находятся на bar.

1 и 3 НЕ связаны, потому что 1 отправился на bar и pool, который не включает kitchen (единственное место, куда 3 отправился)

Мои реальные данные огромны, около 500к. Каков наиболее эффективный способ получить adjacency list? Вот это просто строка в формате source target target, как в https://networkx.github.io/documentation/networkx-1.10/reference/readwrite.adjlist.html

adjacency_list
1 2 4
2 1 4
4 1 2

Можем ли мы избежать петель и использовать трюки Панд?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

А как же:

>>> df
   id    place
0   1      bar
1   1     pool
2   2      bar
3   3  kitchen
>>> df.groupby('place').id.nunique().value_counts()
1    2
2    1
Name: id, dtype: int64
0 голосов
/ 12 ноября 2018

Используя unique, переключите столбец с 0 на 1 и столбец с 1 на 0 concat оба df вместе

adj=pd.DataFrame(df.groupby('place').id.unique().loc[lambda x : x.str.len()>1].tolist())
pd.concat([adj,adj.rename(columns={0:1,1:0})])
Out[810]: 
   0  1
0  1  2
0  2  1

Обновление:

newdf=df.merge(df,on='place')
x=nx.from_pandas_dataframe(newdf,'id_x','id_y') # using merge to get the connect for all id by link columns place. 
[list(itertools.permutations(x, len(x)) for x in list(nx.connected_components(x))] # using permutations get the all combination for each  connected_components in networkx 
Out[821]: [[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]]

Ввод данных

df
Out[822]: 
   id place
0   1   bar
1   1  pool
2   2   bar
3   3   bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...