如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?

Posted

技术标签:

【中文标题】如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?【英文标题】:How can I workout the difference between two values in a column while remaining in the bounds of another column? 【发布时间】:2021-05-14 10:33:09 【问题描述】:

我有一个数据框,我试图计算两个不同主题之间的时间差,同时保持在通话中,而不是溢出到新通话中(即,同时确保它没有计算出不同通话中主题之间的时间差)。其中interaction_id 是单独的调用

这是一个示例数据框

df = pd.DataFrame([[1, 2, 'Cost'], [1, 5.72, NaN], [1, 8.83, 'Billing'], [1, 12.86, NaN], [2, 2, 'Cost'], [2, 6.75, NaN], [2, 8.54, NaN], [3, 1.5, 'Payments'],[3, 3.65, 'Products']], columns=['interaction_id', 'start_time', 'topic'])

      interaction_id    start_time     topic 
           1               2           Cost
           1              5.72          NaN
           1              8.83         Billing
           1              12.86         NaN
           2               2            Cost
           2              6.75          NaN
           2              8.54          NaN
           3              1.5          Payments
           3              3.65         Products

这是所需的输出

df2 = pd.DataFrame([[1, 2, 'Cost',6.83], [1, 5.72, NaN, NaN], [1, 8.83, 'Billing',4.03], [1, 12.86, NaN,NaN], [2, 2, 'Cost',6.54], [2, 6.75, NaN, NaN], [2, 8.54, NaN, NaN], [3, 1.5, 'Payments', 2.15],[3, 3.65, 'Products','...']], columns=['interaction_id', 'start_time', 'topic','topic_length])

       interaction_id    start_time     topic     topic_length

           1               2           Cost           6.83
           1              5.72          NaN           NaN
           1              8.83         Billing        4.03
           1              12.86         NaN           NaN
           2               2            Cost          6.54
           2              6.75          NaN           NaN
           2              8.54          NaN           NaN
           3              1.5          Payments       2.15
           3              3.65         Products       ....

我希望这是有道理的

【问题讨论】:

欢迎来到 SO。请注意,通常不鼓励使用代码/日期的图像。另外,请阅读this guide 并相应地格式化您的问题。 【参考方案1】:

你可以试试下面的方法吗?

我将一个函数应用于每个调用(交互),然后为每个调用分配一个唯一编号 (ngroup) 每个主题。然后我为通话结束分配自己的号码(-1)。然后我使用 diff 来计算主题长度。

import pandas as pd
import numpy as np
from numpy import nan as NaN
df = pd.DataFrame([[1, 2, 'Cost'], [1, 5.72, NaN], [1, 8.83, 'Billing'], [1, 12.86, NaN], [2, 2, 'Cost'], [2, 6.75, NaN], [2, 8.54, NaN], [3, 1.5, 'Payments'],[3, 3.65, 'Products']], columns=['interaction_id', 'start_time', 'topic'])
def func(df):
    ngroup_df = pd.DataFrame("topic":df.ffill()['topic'].drop_duplicates().to_list(),"ngroup":[i for i in range(len(df.ffill()['topic'].drop_duplicates().to_list()))][::-1])
    df = df.ffill().merge(ngroup_df)
    df.loc[df.index.max(), 'ngroup'] = -1
    length_df = df[['start_time','ngroup']].groupby('ngroup').min().diff().dropna().rename('start_time':'length', axis = 1).reset_index()
    length_df['length'] = length_df['length'].abs()
    df.loc[df.index.max(), 'ngroup'] = 0
    return df.merge(length_df, how = 'left')
>>> print(df.groupby(['interaction_id']).apply(func).reset_index(drop = True))
   interaction_id  start_time     topic  ngroup  length
0               1        2.00      Cost       1    6.83
1               1        5.72      Cost       1    6.83
2               1        8.83   Billing       0    4.03
3               1       12.86   Billing       0    4.03
4               2        2.00      Cost       0    6.54
5               2        6.75      Cost       0    6.54
6               2        8.54      Cost       0    6.54
7               3        1.50  Payments       1    2.15
8               3        3.65  Products       0     NaN

【讨论】:

嗨亚当,我不断收到以下错误“无法从重复轴重新索引” 嗨@CurtisRob,我刚刚编辑了代码以包含从导入到结果的所有内容。这是否解决了导入错误?这些是您指定为所需结果的计算。如果不想重复长度,可以调整代码。 完美!非常感谢@Adam!我真的很感激

以上是关于如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中拆分字段并在另一列中返回值?

TSQL - 如何在另一列中提取具有最小值和最大值的列

Power Query:当特定值出现在另一列中时如何将一个添加到列中

根据另一列中的值比较一列中的两个值

有没有办法将所有 obs 条件保持在另一列的 top_n 值上

在另一列上查找最近的时间戳并在新列中添加值 PySpark