[英]Convert tsv file so i can use it for nodes and edges in python
I have this tsv file i would like to read and somehow count the numbers of nodes in a path 我想读取这个tsv文件,并以某种方式计算路径中的节点数
This is how the parts of tsv file looks like: tsv文件的部分如下所示:
6a3701d319fc3754 1297740409 166 14th_century;15th_century;16th_century;Pacific_Ocean;Atlantic_Ocean;Accra;Africa;Atlantic_slave_trade;African_slave_trade NULL
3824310e536af032 1344753412 88 14th_century;Europe;Africa;Atlantic_slave_trade;African_slave_trade 3
the paths is only the ones looking like this : 14th_century;15th_century; 路径只有这样:14th_century; 15th_century; seperated by ';' 以“;”分隔
my code so fare : 我的代码这么便宜:
import networkx as nx
fh = open("test.tsv", 'rb')
G = nx.read_edgelist("test.tsv", create_using=nx.DiGraph())
print G.nodes()
print G.edges()
So my question is how do i count the numbers of nodes touched by a path? 所以我的问题是如何计算路径触摸的节点数?
I'm using the pandas library here for speed, you can install using pip install pandas
and also check here: http://pandas.pydata.org/ 我在这里使用pandas库来提高速度,您可以使用pip install pandas
进行pip install pandas
,也可以在此处进行检查: http : //pandas.pydata.org/
Firstly construct our dataframe from your sample code: 首先从您的示例代码构建我们的数据框:
In [39]:
temp = """6a3701d319fc3754 1297740409 166 14th_century;15th_century;16th_century;Pacific_Ocean;Atlantic_Ocean;Accra;Africa;Atlantic_slave_trade;African_slave_trade NULL
3824310e536af032 1344753412 88 14th_century;Europe;Africa;Atlantic_slave_trade;African_slave_trade 3"""
# construct the dataframe
# in your case replace io.String() with the path to your tsv file
df = pd.read_csv(io.StringIO(temp), sep='\s+', header=None, names=['a','b','c','d','e'])
df
Out[39]:
a b c \
0 6a3701d319fc3754 1297740409 166
1 3824310e536af032 1344753412 88
d e
0 14th_century;15th_century;16th_century;Pacific... NaN
1 14th_century;Europe;Africa;Atlantic_slave_trad... 3
[2 rows x 5 columns]
In [65]:
# use itertools to flatten our list of lists
import itertools
def to_edge_list(x):
# split on semi-colon
split_list = x.split(';')
#print(split_list)
# get our main node
primary_node = split_list[0]
# construct our edge list
edge_list=[]
# create a list comprehension from the split list
edge_list = [(primary_node, x) for x in split_list[1:] ]
#print(edge_list)
return edge_list
# now use itertools to flatten the list of lists into a single list
combined_edge_list = list(itertools.chain.from_iterable(df['d'].apply(to_edge_list)))
print(combined_edge_list)
[('14th_century', '15th_century'), ('14th_century', '16th_century'), ('14th_century', 'Pacific_Ocean'), ('14th_century', 'Atlantic_Ocean'), ('14th_century', 'Accra'), ('14th_century', 'Africa'), ('14th_century', 'Atlantic_slave_trade'), ('14th_century', 'African_slave_trade'), ('14th_century', 'Europe'), ('14th_century', 'Africa'), ('14th_century', 'Atlantic_slave_trade'), ('14th_century', 'African_slave_trade')]
# Now construct our networkx graph from the edge list
In [66]:
import networkx as nx
G = nx.MultiDiGraph()
G.add_edges_from(combined_edge_list)
G.edges()
Out[66]:
[('14th_century', '15th_century'),
('14th_century', 'Africa'),
('14th_century', 'Africa'),
('14th_century', 'Atlantic_slave_trade'),
('14th_century', 'Atlantic_slave_trade'),
('14th_century', 'African_slave_trade'),
('14th_century', 'African_slave_trade'),
('14th_century', '16th_century'),
('14th_century', 'Accra'),
('14th_century', 'Europe'),
('14th_century', 'Atlantic_Ocean'),
('14th_century', 'Pacific_Ocean')]
draw the graph (doesn't look pretty but what the hell): 绘制图形(看上去不漂亮,但是到底是什么):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.