データフレームから接続コンポーネントを得る

How can I collect id into list according to relation column in pandas – StackOverflow

最初,これもう質問っていうよりなぞなぞじゃないかなって感じで面白かった.時間効率に関する質問だけど,実際のところ,時間効率が良いかどうか(少なくとも悪くは無いだろうけど,処理的にはループなのはループなので)は分からないけど,リーズナブルチョイスとしてはPandasとNetworkxの合わせ技だろうなと.

与えられた例から,有向グラフを描いてみると分かり易くて,

import pandas as pd
import numpy as np
import networkx as nx
from itertools import chain
import io


strings = """  id  near_relation
0  A        [B, D]
1  B     [A, H, N]
2  C        [I, R]
3  D        [A, E]
4  E        [D, M]
5  F        [J, K]
6  J        [F, P]
7  P        [J, S]"""
df = pd.read_csv(io.StringIO(strings), sep='\s{2,}', engine='python')
df['near_relation'] = df['near_relation'].str.findall(r'[A-Z]')
display(df)

c = df['near_relation'].map(len).values
d = {
    'id': df['id'].values.repeat(c), 
    'near_relation': np.array(list(chain.from_iterable(df['near_relation'].tolist())))
}
df2 = pd.DataFrame(d)
display(df2)

G = nx.from_pandas_edgelist(
    df2, 'id', 'near_relation', create_using=nx.MultiDiGraph()
)
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
    id  near_relation
0   A   [B, D]
1   B   [A, H, N]
2   C   [I, R]
3   D   [A, E]
4   E   [D, M]
5   F   [J, K]
6   J   [F, P]
7   P   [J, S]

    id  near_relation
0   A   B
1   A   D
2   B   A
3   B   H
4   B   N
5   C   I
6   C   R
7   D   A
8   D   E
9   E   D
10  E   M
11  F   J
12  F   K
13  J   F
14  J   P
15  P   J
16  P   S

download002

3つのグループがあって,idから強い紐帯を持つ部分を求める様な処理を考えれば良い事が分かる.

lst = df['id'].tolist()
g = (s.intersection(lst) for s in nx.strongly_connected_components(G))
res = [x for x in g if x]
res
[{'A', 'B', 'D', 'E'}, {'C'}, {'F', 'J', 'P'}]
広告
カテゴリー: 未分類 パーマリンク

データフレームから接続コンポーネントを得る への1件のフィードバック

  1. ピンバック: ベクトルから同じクラスのノードを効率的に抽出 – エッジを表す集合から接続コンポーネントを求める | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください