【问题标题】:Create network based on two columns of a dataframe and add its components ids as a new aggregated column基于数据框的两列创建网络并将其组件 ID 添加为新的聚合列
【发布时间】:2018-09-07 17:46:28
【问题描述】:

在 R 中,我可以基于数据帧的两列创建网络,然后将其集群成员 ID 作为新的聚合列分配给原始数据帧,如下所示。

library(igraph)
library(data.table)
g = graph_from_data_frame(df[, .(col1, col2)])
clu = clusters(g)
df[, cluId := clu$membership[as.character(df[, col1])]]

您将如何在 Python 中使用 pandas 和 igraph 或 networkx 执行相同的操作? 我在这里发现了一个类似的问题,但提供的答案很慢。

Assigning Group ID to components in networkx

示例:

【问题讨论】:

  • 你想如何从数据框创建网络?你能举个例子吗?
  • @ducminh 我已经编辑了这个问题。
  • 你的问题还不清楚。图与数据框有何关系?你说的集群是什么意思?图的连通分量?
  • @ducminh 是的,集群是指连接的组件。谢谢
  • 但是你想如何从数据框构造图形呢?还是您只想找到给定图形的连通分量?

标签: python r pandas data.table networkx


【解决方案1】:
import networkx as nx

# Create the graph from the dataframe
g = nx.Graph()
g.add_edges_from(df.itertuples(index=False))

connected_components = nx.connected_components(g)

# Find the component id of the nodes
node2id = {}
for cid, component in enumerate(connected_components):
    for node in component:
        node2id[node] = cid

现在node2id 是一个字典,将节点映射到其组件的 id。然后,您可以根据此 dict 生成一列并将其添加到原始数据框中,如 michaelg's answer 中所示。

编辑

从数据框中获取图形的更好方法:

g = nx.from_pandas_edgelist(df, 0, 1)

【讨论】:

  • 如果您在最后一行完成,我可以接受您的回答。 df['cluId'] = df['col1'].map(node2id) 谢谢
【解决方案2】:

如何为 pandas Dataframe 分配簇号?

为了演示,我们将生成一个数据框:

def get_letter():
    return random.choice(list(set(string.ascii_letters.upper())))

origin = [get_letter() for i in range(100)]
destination = [get_letter() for i in range(100)]

df = pd.DataFrame({'origin':origin, 'destination': destination})

获取集群

clusters = [random.choice(range(100)) for i in range(100)]

将集群分配为原始数据框的新列

df['cluster'] = clusters

[输出:]

目的地 原点
D        J       53
M        L       60      
K       L       3       

【讨论】:

  • 在您的示例中,集群与其他两列的关系如何?
  • 据我了解您的问题,您是在询问是否向原始数据框添加新列。在这里,我只是使用了一个随机的簇号。您的问题是否与聚类算法的选择有关?
  • 前两列的所有连接组件创建一个集群。就像问题中提供的示例一样。谢谢
  • 如果不了解所使用的聚类算法,我无法帮助您重现相同的结果。你的例子对我没有任何意义。
  • dataframe 中的每一行都是图的一条边,col1、col2 中的每个元素都是一个节点。
猜你喜欢
  • 2019-11-29
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多