Python: преобразование Edgelist из NetworkX в информационный фрейм - PullRequest
0 голосов
/ 15 ноября 2018

У меня странная структура данных (не знаю, список это или кортеж) в результате использования 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 голосов
/ 30 ноября 2018
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)
0 голосов
/ 15 ноября 2018

Вероятно, проще всего сначала немного упростить данные перед созданием кадра данных.В зависимости от операции, которая дала вам исходные данные (список кортежей, каждый из которых содержит 2 строки и один и тот же), может быть возможно, что эта операция даст вам упрощенные данные.Но в случае, если это невозможно - или, в более общем случае, когда у вас нет контроля над структурами данных, сгенерированными данной библиотекой, вы можете сделать несколько простых манипуляций, например, так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...