Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫从多行创建链接对_Python_Python 3.x_Pandas_Dataframe_Sankey Diagram - Fatal编程技术网

Python 熊猫从多行创建链接对

Python 熊猫从多行创建链接对,python,python-3.x,pandas,dataframe,sankey-diagram,Python,Python 3.x,Pandas,Dataframe,Sankey Diagram,我有一个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:

我有一个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包含三列:
source
target
value
value
是具有这样一个步骤对的
id
s的计数

所需df:

    source   target   value
0   A        B        1
1   B        C        2
我知道我可以使用
groupby
cat
step
塞入一行。然而,我认为这只会创造一个不同的起点,而不会真正提出一个解决方案。困难的部分原因在于,这些步骤依赖于
dttm
保持有序,以便正确地配对这些步骤。此外,它必须是动态的,因为可能有任意数量的步骤,这增加了难度

我应该如何动态地“填充”
步骤
列以获得链接数据

有没有一种方法可以将df连接到自身以获得所有对,然后删除在连接过程中创建的但毫无意义的行

感谢您的所有见解

让我们试试:

(df.groupby('id')['step'].apply(lambda x: pd.DataFrame(list(zip(x, x[1:]))).set_index([0,1]).assign(count=1))
   .rename_axis(['id','source','target'])
   .sum(level=[1,2]).reset_index())
输出:

  source target  count
0      A      B      1
1      B      C      2

我想出了一个解决办法。这不是像Scott那样一步到位的解决方案,但我认为它更容易理解。此外,它运行速度要快得多:

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

df['sequence'] = df.groupby('id').cumcount()
df2 = df
合并
id
上的数据帧,然后仅保留根据顺序有意义的行:

result = df.merge(df2, on='eoawthread_id', how='left')
result = result[result['sequence_x']+1==result['sequence_y']]
将生成的df按步长对分组,并使用
大小
获得
。然后重置索引并重命名列:

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

“目标”列是什么?如果只使用groupby,为什么它需要是动态的。
target
是流程中的下一步。因为
groupby
会将所有步骤放在一行(即A-->B-->C)而不是唯一的对中。谢谢Scott,这非常有效!请检查我的替代解决方案也。我喜欢你的解决方案的简洁性,但它运行的时间要长得多。@CameronTaylor我很高兴你得到了你所需要的+1.关于你的解决方案,请向我咨询。