Python 熊猫从多行创建链接对
我有一个df,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:
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.关于你的解决方案,请向我咨询。