2017-09-19 34 views
0

我使用networkx從txt文件構建電子郵件網絡結構,其中每行表示一個「邊緣」。我首先加載txt文件(3列:{ '#Sender', '收件人', '時間'})成Python,然後使用下面的代碼轉換爲networkx對象:將大熊貓數據框轉換爲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

然而,email_df(一pandasDataFrame對象)有82927的長度,而email(一Networkx對象)有3251

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

的長度我真的很困惑,因爲即使包含的行相同的兩個節點在email_df的前兩列中具有相同的方向序列(比如'1'到'2'),第三列('時間',意思是時間戳)應該將它們彼此區分開來,因此不會複製邊緣會出現。那麼爲什麼在我使用nx.from_pandas_dataframe從`email_df'中讀取之後,邊的數量從82927急劇減少到了3251?

有人會幫我解釋一下嗎?

謝謝。

+0

代碼窗口是指僅適用於JS代碼。對於所有其他語言,請粘貼您的代碼,突出顯示它並按ctrl + k進行格式化。 –

回答

1

你在這裏行稱取Sender列源節點,該Recipient列作爲目標,並添加time邊緣屬性。因此,您只在發件人和收件人之間創建單個(定向)邊緣,並且只有最後一行的時間將作爲邊緣的屬性添加。

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

感謝您的回覆。您對我的代碼的解釋是正確的,但我並不打算僅將最後一行的時間作爲'發件人'和'收件人'之間的'時間'屬性作爲屬性加入。我怎樣才能恢復那些缺少的「邊緣」? –

+0

您只能在一對節點之間定義一條邊 - 我已將一個示例添加到了我可以合併缺失數據的一種方式。 –

+0

嗨,我試過你的代碼,但Python仍然返回3251的長度。 –

相關問題