gpt4 book ai didi

python - Pandas 从多行创建链接对

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:01 24 4
gpt4 key购买 nike

我有一个 df,id 作为流 ID,dttm 作为 step 修改时间,step 作为流程中的步骤。目前由 dttm 订购。对于特定的 id 可以有任意数量的步骤。

当前 df:

    id      dttm                  step
0 81 2015-05-26 07:56:03 A
1 81 2015-05-26 08:19:07 B
2 81 2015-05-26 08:32:05 C
3 91 2015-05-26 08:07:12 B
4 91 2015-05-26 08:07:12 C

我想创建链接数据以输入 Sankey。因此,我最终想要一个包含三列的 df:sourcetargetvaluevalue 是具有这样一个步骤对的 id 的计数。

期望的 df:

    source   target   value
0 A B 1
1 B C 2

我知道我可以使用 groupbycatstep 填充到一行中。但是,我认为这只会创建一个不同的起点,而不会真正推进解决方案。造成困难的部分原因是这些步骤依赖于 dttm 来保持顺序,以便这些步骤适当配对。此外,它必须是动态的,因为可能有任意数量的步骤,这增加了难度。

我应该如何动态“填充”step 列以获取链接数据?

有没有办法将 df 连接到自身以获得所有对,然后删除在连接期间创建但无意义的行?

感谢您的任何见解!

最佳答案

我想出了一个解决办法。它不是像 Scott 那样的一步解决方案,但我认为它更容易理解。而且,它运行得非常非常快:

为每组id添加一个序列。然后复制 df 以允许自合并:

df['sequence'] = df.groupby('id').cumcount()
df2 = df

合并 id 上的数据帧,然后只保留基于序列有意义的行:

result = df.merge(df2, on='id', how='left')
result = result[result['sequence_x']+1==result['sequence_y']]

按步骤对对生成的 df 进行分组,并使用 size 获取 value。然后重置索引并重命名列:

result = pd.DataFrame(result.groupby(['step_x','step_y']).size().rename('value'))
result = result.reset_index()
result.columns = ['source','target','value']

关于python - Pandas 从多行创建链接对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com