微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Pandas Dataframe 中,在某些列中具有共同值的不同行之间构建 networkx 图表或流程图

如何解决从 Pandas Dataframe 中,在某些列中具有共同值的不同行之间构建 networkx 图表或流程图

我正在处理显示多行订单流的数据,每一行都是一个独立的站点/站点。示例数据如下所示:

  Firm           event_type   id prevIoUs_id
0    A                 send  111            
1    B     receive and send  222         111
2    C  receive and execute  333         222
3    D  receive and execute  444         222
4    E   receive and cancel  123         100

这里的链接是由“id”和“prevIoUs_id”两个字段决定的。例如,在样本数据中,B 公司的 prevIoUs_id 与 A 公司的 id 相同,111。因此订单从 A 公司流向 B 公司。

对于公司 E,由于其 prevIoUs_id 与任何行的 id 都不匹配,因此我打算将其作为流程中的一个独立部分。

因此,我想根据示例数据实现的目标是这样的:

Flow

(颜色仅用于说明目的,不是必须的)。

我一直试图在此 related question 中处理来自 @Dinari 的回答,但无法使其正常工作。我希望networkx有向图的标签是具有共享值的列以外的列。

谢谢。

解决方法

# convert dataypes to ensure that dictionary access will work
df['id'] = df['id'].astype(str)
df['previous_id'] = df['previous_id'].astype(str)

# create a mapping from ids to Firms
replace_dict = dict(df[['id','Firm']].values)

# apply that mapping. If no Firm can be found use placeholders 'no_source' and 'no_target'
df['source'] = df['previous_id'].apply(lambda x: replace_dict.get(x) if replace_dict.get(x) else 'no_source' )
df['target'] = df['id'].apply(lambda x: replace_dict.get(x) if replace_dict.get(x) else 'no_target' )

#make the graph
G = nx.from_pandas_edgelist(df,source='source',target='target')

# drop all placeholder nodes
G.remove_nodes_from(['no_source','no_target'])

# draw graph
nx.draw_networkx(G,node_shape='s')

编辑:要包含箭头,创建一个有向图(DiGraph):

#make the graph
G = nx.from_pandas_edgelist(df,target='target',create_using=nx.DiGraph)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。