从 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)