【问题标题】:Pandas Create Link Pairs from Multiple RowsPandas 从多行创建链接对
【发布时间】:2017-07-28 15:18:10
【问题描述】:

我有一个 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 是具有此类步骤对的 ids 的计数。

所需的df:

    source   target   value
0   A        B        1
1   B        C        2

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

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

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

感谢您的所有见解!

【问题讨论】:

  • target 的列是什么?如果您只使用 groupby,为什么它需要是动态的。
  • target 是流程的下一步。因为groupby 会将所有步骤放在一行中(即 A --> B --> C),而不是唯一的对。

标签: python python-3.x pandas dataframe sankey-diagram


【解决方案1】:

我想出了一个解决方案。它不是像 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']

【讨论】:

    【解决方案2】:

    让我们试试吧:

    (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,这非常有效!也请查看我的替代解决方案。我喜欢您解决方案的简洁性,但运行时间要长得多。
    • @CameronTaylor 我很高兴你得到了你需要的东西。我为您的解决方案 +1。
    猜你喜欢
    • 1970-01-01
    • 2023-01-06
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多