我有一个具有ID,START和END时间戳记的数据框以及另一个具有ID,TIME和WEIGHT列的参考表。现在,我正在尝试根据时间将权重分配给df1。
如果df2的时间在df1的开始和结束之间,则应为df1中的记录分配相应的权重。我可以简单地使用左连接,但是问题是可能为同一ID分配了两个或三个权重
df1:
ID START END
2591642409 2018-08-20 06:00:00 2018-08-20 16:59:59
2591642409 2018-08-20 17:00:00 2018-08-21 01:59:59
2591642409 2018-08-21 02:00:00 2018-08-21 14:59:59
2591642409 2018-08-21 15:00:00 2018-08-21 15:59:59
2591642409 2018-08-21 15:00:00 2018-08-21 15:59:59
2591642409 2018-08-21 15:00:00 2018-08-21 14:59:59
2591642409 2018-08-21 15:00:00 2018-08-21 14:59:59
2591642409 2018-08-21 16:00:00 2018-08-25 11:59:59
2626784515 2018-09-12 12:41:00 2018-09-12 17:59:59
2626784515 2018-09-12 18:00:00 2018-09-12 22:27:59
2626784515 2018-09-12 22:28:00 2018-09-13 23:32:59
2626784515 2018-09-14 00:00:00 2018-09-13 23:59:59
2631776057 2018-09-16 03:29:00 2018-09-16 12:39:59
2631776057 2018-09-16 12:40:00 2018-09-16 13:33:59
2631776057 2018-09-16 13:34:00 2018-09-16 14:10:59
2694817807 2018-10-31 10:30:00 2018-11-01 15:57:59
2694817807 2018-11-01 15:58:00 2018-11-02 22:59:59
2694817807 2018-11-02 23:00:00 2018-11-02 23:55:59
2694817807 2018-11-02 23:56:00 2018-11-09 00:18:59
2694817807 2018-11-09 00:19:00 2018-11-09 05:55:59
2694817807 2018-11-09 05:56:00 2018-11-09 08:34:59
2694817807 2018-11-09 08:35:00 2018-11-09 16:59:59
2694817807 2018-11-09 17:00:00 2018-11-10 04:29:59
2694817807 2018-11-10 04:30:00 2018-11-10 09:23:59
2694817807 2018-11-10 09:24:00 2018-11-11 03:09:59
2694817807 2018-11-11 03:10:00 2018-11-11 16:54:59
2694817807 2018-11-11 16:55:00 2018-11-11 20:55:59
2694817807 2018-11-11 20:56:00 2018-11-12 19:59:59
2711413129 2018-11-12 20:00:00 2018-11-13 04:20:59
df2:
ID TIME WEIGHT
2591642409 2018-08-15 01:42:13 3.38
2626784515 2018-09-12 14:56:03 3.7
2631776057 2018-09-16 07:05:45 3.7
2694817807 2018-10-31 14:21:54 4.5
2694817807 2018-11-09 05:29:52 4.8
2711413129 2018-11-12 17:14:26 4.8
预期df:
ID START END WEIGHT
2591642409 2018-08-20 06:00:00 2018-08-20 16:59:59 3.38
2591642409 2018-08-20 17:00:00 2018-08-21 01:59:59 3.38
2591642409 2018-08-21 02:00:00 2018-08-21 14:59:59 3.38
2591642409 2018-08-21 15:00:00 2018-08-21 15:59:59 3.38
2591642409 2018-08-21 15:00:00 2018-08-21 15:59:59 3.38
2591642409 2018-08-21 15:00:00 2018-08-21 14:59:59 3.38
2591642409 2018-08-21 15:00:00 2018-08-21 14:59:59 3.38
2591642409 2018-08-21 16:00:00 2018-08-25 11:59:59 3.38
2626784515 2018-09-12 12:41:00 2018-09-12 17:59:59 3.7
2626784515 2018-09-12 18:00:00 2018-09-12 22:27:59 3.7
2626784515 2018-09-12 22:28:00 2018-09-13 23:32:59 3.7
2626784515 2018-09-14 00:00:00 2018-09-13 23:59:59 3.7
2631776057 2018-09-16 03:29:00 2018-09-16 12:39:59 3.7
2631776057 2018-09-16 12:40:00 2018-09-16 13:33:59 3.7
2631776057 2018-09-16 13:34:00 2018-09-16 14:10:59 3.7
2694817807 2018-10-31 10:30:00 2018-11-01 15:57:59 4.5
2694817807 2018-11-01 15:58:00 2018-11-02 22:59:59 4.5
2694817807 2018-11-02 23:00:00 2018-11-02 23:55:59 4.5
2694817807 2018-11-02 23:56:00 2018-11-09 00:18:59 4.5
2694817807 2018-11-09 00:19:00 2018-11-09 05:55:59 4.5
2694817807 2018-11-09 05:56:00 2018-11-09 08:34:59 4.8
2694817807 2018-11-09 08:35:00 2018-11-09 16:59:59 4.8
2694817807 2018-11-09 17:00:00 2018-11-10 04:29:59 4.8
2694817807 2018-11-10 04:30:00 2018-11-10 09:23:59 4.8
2694817807 2018-11-10 09:24:00 2018-11-11 03:09:59 4.8
2694817807 2018-11-11 03:10:00 2018-11-11 16:54:59 4.8
2694817807 2018-11-11 16:55:00 2018-11-11 20:55:59 4.8
2694817807 2018-11-11 20:56:00 2018-11-12 19:59:59 4.8
2711413129 2018-11-12 20:00:00 2018-11-13 04:20:59 4.8
我正在使用以下代码
mask = (df2['TIME'] > df1['START']) & (df2['TIME'] < df1['END'])
df1['WEIGHTS'] = np.where(mask, df2['WEIGHTS'], '')
但是它抛出一个值错误,提示
ValueError: Can only compare identically-labeled Series objects
如果能得到帮助,我将非常感谢。
答案 0 :(得分:0)
您无法比较来自熊猫中不同数据框的具有不同名称的两个系列。您必须更改名称或将两个数据框合并。在这种情况下,我相信加入是最佳选择。由于len(df1) != len(df2)
加入数据框后,您应该可以使用代码。
答案 1 :(得分:0)
您可以先尝试将两个框架合并或合并...然后应用滤镜
df1.set_index('ID', inplace=True)
df2.set_index('ID', inplace=True)
df = df1.join(df2)
df_filtered = df[(df['TIME'] > df['START']) & (df['TIME'] < df['END'])]