Edgelist в pandas кадре данных для визуализации с помощью networkx - PullRequest
4 голосов
/ 03 августа 2020

Мне трудно представить фрейм данных как сеть с помощью networkx. Проблема, похоже, связана с размером фрейма данных или, чтобы лучше объяснить, с наличием дубликатов внутри фрейма данных.

Мой набор данных

   Src          Dst
x.serm.cool    [x.serm.cool, x.creat.cool]
x.creat.cool   [x.creat.cool, x.serm.cool]
sms.sol.tr     [sms.sol.tr]
bbb.asl.gt     [bbb.asl.gt,cdc.fre.gh,str.alert.jf]
cdc.fre.gh     [cdc.fre.gh, bbb.asl.gt,str.alert.jf]
str.alert.jf   [str.alert.jf, bbb.asl.gt, cdc.fre.gh]
    ...
x.serm.cool    [x.serm.cool]

где Src ' Значения s используются как узлы, а Dst как ребра. Это означает, что, например, у x.serm.cool есть две ссылки, одна с собой (но это не нужно учитывать), а другая с x.creat.cool. Другой пример: str.alert.jf имеет три ссылки: одна на себя (но не имеет значения); один с bbb.asl.gt, а другой с cdc.fre.gh. Все ссылки ненаправленные. Я попытался представить некоторые узлы в списке разными цветами:

df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh "]), "color"] = "green"
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))

G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color) 

, но у меня появилось сообщение об ошибке из-за: df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(",")). Как объясняется YOBEN_S в связанном вопросе (см. Внизу этого вопроса), проблема заключается в рассмотрении списка вместо строки. Однако, когда я пытаюсь сделать следующее:

test=["x.serm.cool", "cdc.fre.gh "]
df['color'] = np.where(df.Src.isin(test), "blue", "green")
G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color)

, я получаю эту ошибку:

ValueError: 'c' argument has 79 elements, which is inconsistent with 'x' and 'y' with size 76.

Мой исходный набор данных имеет длину 79, а 76 кажется длиной / размер набора данных без Src дубликатов. Я думаю, что дубликаты могут быть важны, поскольку они определяют размер узла, поэтому я бы предпочел не удалять их из моего набора данных и сети.

Не могли бы вы помочь мне разобраться в этой проблеме?

Связанные вопросы и ответы:

1 Ответ

1 голос
/ 03 августа 2020

Проблема, с которой вы столкнулись, заключается в том, что некоторые элементы в ваших данных дублируются. Чтобы решить эту проблему, вам нужно использовать drop_duplicates в соответствующих местах:

df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh"]), "color"] = "green"
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
df = df.explode("Dst").drop_duplicates()
G = nx.from_pandas_edgelist(df, 'Src', 'Dst')

colors = df[["Src", "color"]].drop_duplicates()["color"]
nx.draw(G, node_color = colors)

Результат:

введите описание изображения здесь

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