用序列信息表示 pandas 数据帧中的流程图
Represent a process flow diagram in a pandas dataframe with sequence information
我正在尝试在 pandas 数据框中表示流程图。让我给你举个例子,假设我们有一个这样的流程图 -
流程图:-
请看图片。现在,我已经根据图像中的信息创建了 pandas 数据框 -
process name
Id
To Id
process 1
10
200
process 1
10
80
process 2
200
8
process 3
80
NAN
process 4
8
70
process 5
70
NAN
你们可以通过->
生成上面的数据框
df_2 = pd.DataFrame({'process name': {0: 'process 1',
1: 'process 1',
2: 'process 2',
3: 'process 3',
4: 'process 4',
5: 'process 5'},
'Id': {0: 10, 1: 10, 2: 200, 3: 80, 4: 8, 5: 70},
'To Id': {0: 200, 1: 80, 2: 8, 3: None, 4: 70, 5: None}})
我想再添加一个这样的信息栏-
process name
Id
To Id
Sequence
Start
0
10
0
process 1
10
200
1
process 1
10
80
1
process 2
200
8
2
process 3
80
NAN
2
process 4
8
70
3
process 5
70
NAN
4
在这里,我创建了一个额外的行,进程名称为 start(sequence 0),代表我的图表的开始(id =0
和 To Id=10
)。
然后序列算法检查 id 列中的 10,并且有 2 个匹配项。因此,它将这些行标记为 1 并存储 to ID
信息。
它会再次从 [200,80] 中选择 1 个“to ID”。假设 80 然后它将重复相同的过程并将以 80 开头的行标记为序列 2,这里 To Id
是 NAN 因此该过程将停止并检查 To ID
200.
有什么简单的方法可以快速添加这个序列列信息吗?有什么好的算法吗?
我可以使用 set diff 提取第一行。像这样 -
id = set(df['Id'].to_list())
to_id = set(df['To Id'].to_list())
id - to_id #will give output 10 which is our start point.
从这里开始我需要帮助如何从这里实现序列列?
假设没有一个步骤有 2 个或更多父代(这是具有唯一序列标识的必要条件):
# this has to be defined *after* df_2 initialisation
def count_prev(curr) -> int:
new = df_2.loc[df_2['To Id'].eq(curr), 'Id']
if(len(new)>0):
return count_prev(new.iloc[0]) + 1
return 1
df_2['Sequence'] = df_2['Id'].agg(count_prev)
结果:
process name Id To Id Sequence
0 process 1 10 200.0 1
1 process 1 10 80.0 1
2 process 2 200 8.0 2
3 process 3 80 NaN 2
4 process 4 8 70.0 3
5 process 5 70 NaN 4
我正在尝试在 pandas 数据框中表示流程图。让我给你举个例子,假设我们有一个这样的流程图 - 流程图:-
请看图片。现在,我已经根据图像中的信息创建了 pandas 数据框 -
process name | Id | To Id |
---|---|---|
process 1 | 10 | 200 |
process 1 | 10 | 80 |
process 2 | 200 | 8 |
process 3 | 80 | NAN |
process 4 | 8 | 70 |
process 5 | 70 | NAN |
你们可以通过->
生成上面的数据框df_2 = pd.DataFrame({'process name': {0: 'process 1',
1: 'process 1',
2: 'process 2',
3: 'process 3',
4: 'process 4',
5: 'process 5'},
'Id': {0: 10, 1: 10, 2: 200, 3: 80, 4: 8, 5: 70},
'To Id': {0: 200, 1: 80, 2: 8, 3: None, 4: 70, 5: None}})
我想再添加一个这样的信息栏-
process name | Id | To Id | Sequence |
---|---|---|---|
Start | 0 | 10 | 0 |
process 1 | 10 | 200 | 1 |
process 1 | 10 | 80 | 1 |
process 2 | 200 | 8 | 2 |
process 3 | 80 | NAN | 2 |
process 4 | 8 | 70 | 3 |
process 5 | 70 | NAN | 4 |
在这里,我创建了一个额外的行,进程名称为 start(sequence 0),代表我的图表的开始(id =0
和 To Id=10
)。
然后序列算法检查 id 列中的 10,并且有 2 个匹配项。因此,它将这些行标记为 1 并存储 to ID
信息。
它会再次从 [200,80] 中选择 1 个“to ID”。假设 80 然后它将重复相同的过程并将以 80 开头的行标记为序列 2,这里 To Id
是 NAN 因此该过程将停止并检查 To ID
200.
有什么简单的方法可以快速添加这个序列列信息吗?有什么好的算法吗?
我可以使用 set diff 提取第一行。像这样 -
id = set(df['Id'].to_list())
to_id = set(df['To Id'].to_list())
id - to_id #will give output 10 which is our start point.
从这里开始我需要帮助如何从这里实现序列列?
假设没有一个步骤有 2 个或更多父代(这是具有唯一序列标识的必要条件):
# this has to be defined *after* df_2 initialisation
def count_prev(curr) -> int:
new = df_2.loc[df_2['To Id'].eq(curr), 'Id']
if(len(new)>0):
return count_prev(new.iloc[0]) + 1
return 1
df_2['Sequence'] = df_2['Id'].agg(count_prev)
结果:
process name Id To Id Sequence
0 process 1 10 200.0 1
1 process 1 10 80.0 1
2 process 2 200 8.0 2
3 process 3 80 NaN 2
4 process 4 8 70.0 3
5 process 5 70 NaN 4