2017-09-19 30 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的长度。 –

相关问题