我需要根据与前几行相关的某些条件为我的行创建一个唯一的“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”开始的位置)。一如既往地感谢你的帮助!你知道吗
您的
np.where
是一个好主意,但有一点不同:如果条件不满足,则分配1
;如果条件满足,则分配None
,例如:现在,您有了} 、
1
每一行,您想增加id
中的值,因此可以使用^{ffill
和astype
(使ge integer不是float),例如:举个例子
相关问题 更多 >
编程相关推荐