Python将根据条件创建正在运行的“id”

2024-05-13 21:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要根据与前几行相关的某些条件为我的行创建一个唯一的“ID”字段。你知道吗

下面是我的数据示例:

  current_driver customer_id    pu_actual_dt      service
0        167       1214      2018-06-28 13:24:00    DED
1        167       1214      2018-06-28 13:25:00    DED
2        167       1214      2018-06-28 14:43:00    DED
3        243       1214      2018-06-28 19:41:00    DED
4        243       1214      2018-06-28 19:41:00    DED
5        250       1214      2018-06-28 17:19:00    DED
6        250       1214      2018-06-28 18:00:00    DED
7        250       1214      2018-06-28 18:18:00    DED
8        259       1214      2018-06-28 19:40:00    DED
9        259       1214      2018-06-28 19:40:00    DED
10       259       1214      2018-06-28 20:14:00    DED
11       260       1214      2018-06-28 17:39:00    DED
12       260       1214      2018-06-28 17:39:00    DED
13       260       1214      2018-06-28 17:39:00    DED
14       260       1214      2018-06-28 17:39:00    DED
15       263       1214      2018-06-28 18:34:00    DED
16       263       1214      2018-06-28 18:43:00    DED
17       263       1214      2018-06-28 18:43:00    DED

我需要做的是用以下逻辑创建另一列:如果当前的驱动程序与前一行的当前驱动程序相同,并且customer id与前一行的customer id相同,并且pu\u实际的\u dt在前一行的半小时内,那么它应该都具有相同的id。因此它将从“1”开始前两排,但由于第三排的pu_实际dt是半个多小时后,它的ID是“2”。然后第四行有一个不同的驱动程序,因此它的ID为“3”,同时还有第5行,因为它与第4行的driver/customer\u ID/pu\u actual\u dt相同。你知道吗

在我解释pu_actual_dt中的微小差异(参见前两行)之前,我能够通过连接字段并在每次行与前一个连接不匹配时启动一个新ID来解决它。例如,我用这个来创建ID:

df = df.assign(id=(df['route_concate']).astype('category').cat.codes)

然而,当我在pu\u实际的\u dt中有微小的差异时,这种连接逻辑就不起作用了。你知道吗

所以我试着通过这样做来解释微小的时间变化:

df['id'] = np.where((df['current_driver'] == df['current_driver'].shift(1) ) 
& (df['customer_id'] == df['customer_id'].shift(1)) 
& (df['pu_actual_dt'] < df['pu_actual_dt'].shift(1) + pd.Timedelta(minutes=30)) 
& (df['pu_actual_dt'] > df['pu_actual_dt'].shift(1) - pd.Timedelta(minutes=30)) 
& (df['service'] == 'DED'), df['id'].shift(1), df['id'].shift(1) + 1)

这里我要做的是,对于每一行,如果当前驱动程序=上面一行中的当前驱动程序,客户id=上面一行中的客户id,则pu实际\u dt在前一行中pu实际\u dt之前或之后的30分钟内,并且服务='DED',则使用前一行的id。如果不是,则在前一行的ID中添加1。你知道吗

我不确定我做错了什么,但它返回了一些非常不可预测的结果。一度从75号降到34号,然后又降到36号?你知道吗

有什么更好的办法解决我的问题?(也就是ID从“1”开始的位置)。一如既往地感谢你的帮助!你知道吗


Tags: iddfshiftdriverservice驱动程序dtcustomer
1条回答
网友
1楼 · 发布于 2024-05-13 21:01:13

您的np.where是一个好主意,但有一点不同:如果条件不满足,则分配1;如果条件满足,则分配None,例如:

df['id'] = np.where((df['current_driver'] == df['current_driver'].shift(1) ) 
& (df['customer_id'] == df['customer_id'].shift(1)) 
& (df['pu_actual_dt'] < df['pu_actual_dt'].shift(1) + pd.Timedelta(minutes=30)) 
& (df['pu_actual_dt'] > df['pu_actual_dt'].shift(1) - pd.Timedelta(minutes=30)) 
& (df['service'] == 'DED'), None, 1) # NOTE the None and 1 here are explain above

现在,您有了1每一行,您想增加id中的值,因此可以使用^{}ffillastype(使ge integer不是float),例如:

df['id'] = df['id'].cumsum().ffill().astype(int)

举个例子

    current_driver  customer_id        pu_actual_dt service  id
0              167         1214 2018-06-28 13:24:00     DED   1
1              167         1214 2018-06-28 13:25:00     DED   1
2              167         1214 2018-06-28 14:43:00     DED   2
3              243         1214 2018-06-28 19:41:00     DED   3
4              243         1214 2018-06-28 19:41:00     DED   3
5              250         1214 2018-06-28 17:19:00     DED   4
6              250         1214 2018-06-28 18:00:00     DED   5
7              250         1214 2018-06-28 18:18:00     DED   5
8              259         1214 2018-06-28 19:40:00     DED   6
9              259         1214 2018-06-28 19:40:00     DED   6
10             259         1214 2018-06-28 20:14:00     DED   7
11             260         1214 2018-06-28 17:39:00     DED   8
12             260         1214 2018-06-28 17:39:00     DED   8
13             260         1214 2018-06-28 17:39:00     DED   8
14             260         1214 2018-06-28 17:39:00     DED   8
15             263         1214 2018-06-28 18:34:00     DED   9
16             263         1214 2018-06-28 18:43:00     DED   9
17             263         1214 2018-06-28 18:43:00     DED   9

相关问题 更多 >