Python:将Edgelist从NetworkX转换为数据框

时间:2018-11-15 01:37:02

标签: python list dataframe tuples networkx

由于使用Networkx,我的数据结构很奇怪(不知道它是列表还是元组)。我需要将其转换为数据框。

我拥有的“列表”具有以下结构:

[('a', 'a', {'weight': 2}),
 ('a', '!', {'weight': 0}),
 ('a', 'c', {'weight': 2}),
 ('a', 'b', {'weight': 1}),
 ('a', 'q', {'weight': 1}),
 ('a', 's', {'weight': 2}),... ]

并且我需要一个数据框,如下所示:

Inf   Prov  Weight
a        a       2
a        !       0
a        c       2
a        b       1
a        q       1
a        s       2

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

在创建数据帧之前先稍微简化一下数据可能是最容易的。 根据为您提供初始数据的操作(一个元组列表,每个元组包含2个字符串和一个dict),可能有可能使该操作为您提供简化的数据。但是在不可能做到这一点的情况下-或更笼统地说,当您无法控制由给定库生成的数据结构时,您可以执行一些简单的操作,例如像这样:

import pandas as pd
# initial data from qu
raw_data = [('a', 'a', {'weight': 2}),
 ('a', '!', {'weight': 0}),
 ('a', 'c', {'weight': 2}),
 ('a', 'b', {'weight': 1}),
 ('a', 'q', {'weight': 1}),
 ('a', 's', {'weight': 2}),]

# transform data to extract the value of each weight
data = [(elem1, elem2, d_elem.get('weight', 0)) for (elem1, elem2, d_elem) in raw_data]

# put together the dataframe from the list of records
df = pd.DataFrame.from_records(data, columns=['Inf', 'Prov', 'Weight'])
print(df)

根据需要提供结果:

  Inf Prov  Weight
0   a    a       2
1   a    !       0
2   a    c       2
3   a    b       1
4   a    q       1
5   a    s       2

使用dict.get允许我们指定默认值(如果未定义),而不是引发KeyError。

答案 1 :(得分:0)

import pandas as pd
x=[('a', 'a', {'weight': 2}),
 ('a', '!', {'weight': 0}),
 ('a', 'c', {'weight': 2}),
 ('a', 'b', {'weight': 1}),
 ('a', 'q', {'weight': 1}),
 ('a', 's', {'weight': 2})]

inf_list=list([])
prov_list=list([])
weight_list=list([])

for tuple in x:
    inf_list.append(tuple[0])
    prov_list.append(tuple[1])
    weight_list.append(tuple[2])

df=pd.DataFrame()
df['inf']=inf_list
df['prov']=prov_list
df['weight']=weight_list

df['weight']=df['weight'].map(lambda x:x['weight'])

print(df)