Pandas按时间删除重复的行

问题描述 投票:0回答:1

我有以下数据框,它代表了一个服务历史。

                  Start                    End        ContactName      Agente      Code
0   2020-05-05 11:52:34    2020-05-05 18:03:15      473000 Carlos   Pedro BRA    473000
1   2020-05-05 15:39:06    2020-05-05 18:03:09    580000 Rosineia   Pedro BRA    580000
2   2020-05-05 17:47:59    2020-05-05 18:03:06   2038000 Mauricio   Pedro BRA   2038000
3   2020-05-05 17:43:46    2020-05-05 18:02:58   3975000 - Sergio   Pedro BRA   3975000
4   2020-05-05 15:34:44    2020-05-05 17:52:17   3388000  Rodrigo   Pedro BRA   3388000
5   2020-05-05 15:34:43    2020-05-05 17:52:14            4077000   Pedro BRA   4077000
6   2020-05-05 17:45:24    2020-05-05 17:52:08  2064000 Cleberson   Pedro BRA   2064000
7   2020-05-05 18:20:24    2020-05-05 18:25:00  2064000 Cleberson   Pedro BRA   2064000

我想删除在一小时内从同一客户打给同一代理的电话,例如:

  • Cleberson (最后一行)在17: 45开始与代理Pedro预约,17: 52结束。

  • 此后不久(IN LESS THAN HOUR),他又开始了另一项服务,也是在不到一小时内完成的

如果在一小时内发生超过一次的考勤记录,我想只保留一次。

谢谢你的帮助,我尝试了所有的方法,但我不能。

python pandas pandas-groupby
1个回答
1
投票

我想以下策略应该可以解决你的问题。

  1. 通过列对数据框架进行排序: ContactName,Agente,Start。现在你应该有同一客户端的所有实例,以升序的开始时间联系同一个代理。
  2. 您可以使用 pandas shift 操作符来创建您的联系人姓名、代理和开始列,并将其移动一列--有效地创建新的列,使您能够将每一行与前一行进行比较(例如使用--df['ContactName'].shift(1))。现在您可以使用布尔掩码来创建一个依赖于这些新列的列来标记您想要识别的行。

松散地基于你在psuedocode-中的数据。

df = df.sort_values(by=['ContactName', 'Angente', 'Start'])
mask = (df['ContactName'] == df['ContactName'].shift(1)) & (df['Agente'] == df['Agente'].shift(1)) & (abs(df['Start'] - df['Start'].shift(1)) < pd.Timedelta('1 hour')) # select rows that have the same contact, agent as the previous row as well as started with less than 1 hour difference
df.loc[mask, 'to_remove'] = True 
df = df[~df['to_remove'] # filter out redundant values
© www.soinside.com 2019 - 2024. All rights reserved.