根据条件创建新列

时间:2019-08-19 17:42:01

标签: python pandas dataframe

我有一个具有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

如果能得到帮助,我将非常感谢。

2 个答案:

答案 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'])]