如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?
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!我真的很感激以上是关于如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?的主要内容,如果未能解决你的问题,请参考以下文章
Power Query:当特定值出现在另一列中时如何将一个添加到列中