2017-09-19 44 views
0

networkxを使用して、各行が「エッジ」を表すtxtファイルから電子メールネットワーク構造を構築しています。パイソンにし、次のコードを使用して、networkxオブジェクトに変換:私は最初のtxtファイル({ '#Sender'、 '受信者'、 '時間'} 3列):ロードpandasデータフレームをNetworkxオブジェクトに変換するときにエッジ数が異なる

import networkx as nx 
 
import pandas as pd 
 
email_df = pd.read_csv('email_network.txt', delimiter = '->') 
 
email = nx.from_pandas_dataframe(email_df, '#Sender', 'Recipient', edge_attr = 'time')

email.txtのデータには、hereにアクセスできます。 emailNetworkxオブジェクト)3251

In [1]: len(email_df) 
In [2]: 82927 
In [3]: len(email.edges()) 
In [4]: 3251 

の長さを有している

しかし、email_dfpandasDataFrameオブジェクトは)私は本当に混乱しました、82927の長さを持っているためでも含む行の場合最初の2つのノードの同じ2つのノードは同じ方向のシーケンス(例えば '1'から '2')を持ち、3番目のカラム( 'time'はタイムスタンプを意味する)はそれらを互いに区別する必要があるため、エッジが現れる。そして、なぜ私はnx.from_pandas_dataframeを `email_df 'から読み込んだ後、エッジの数が82927から3251に劇的に減少したのですか?

誰でもこのことを私に説明するのに役立つでしょうか?

ありがとうございます。ここ

+0

コードウィンドウが意図されていますJSコードのみ。その他の言語については、コードを貼り付けて強調表示し、Ctrl + Kを押してフォーマットしてください。 –

答えて

1

あなたのラインは、ソース・ノードとターゲットとしてRecipient列をSender列を取り、エッジが属性timeとして追加すると言っています。したがって、送信者と受信者の間に1つの(有向)エッジを作成するだけで、最後の行の時間だけがエッジの属性として追加されます。あなたが唯一のエッジノードのペアのために定義することができ

email = nx.from_pandas_dataframe(email_df, '#Sender', 'Recipient', edge_attr = 'time') 

- あなたのネットワークを構築する前に、グループのデータフレームをでき、エッジの重みとしてのカウントを使用し、

edge_groups = email_df.groupby(["#Sender", "Recipient"], as_index=False).count().rename(columns={"time":"weight"}) 
email = nx.from_pandas_dataframe(edge_groups, '#Sender', 'Recipient', edge_attr = 'weight') 
+0

お返事ありがとうございます。私のコードについてのあなたの説明は正しいですが、SenderとRecipientの与えられたペアの間に 'time'属性として最後の行の時刻だけを属性として含めるつもりはありませんでした。欠けている "エッジ"をどのように回復できますか? –

+0

ノードのペアの間に1つのエッジしか定義できません - 欠落しているデータを組み込むことができる方法の例を私の回答に追加しました。 –

+0

こんにちは、あなたのコードを試しましたが、Pythonはまだ3251の長さを返しました。 –

関連する問題