Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于条件创建新列_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于条件创建新列

Python 基于条件创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有ID、开始和结束时间戳的dataframe和另一个带有ID、时间和权重列的引用表。现在,我尝试根据时间为df1分配权重 如果df2的时间介于df1的开始和结束之间,则应为df1中的记录分配相应的权重。我可以简单地使用左连接,但问题是可能有两个或三个权重分配给同一个ID df1: df2: 预期df: ID START END WEIGHT 2591642409 2018-08-20 06:00:0

我有一个带有ID、开始和结束时间戳的dataframe和另一个带有ID、时间和权重列的引用表。现在,我尝试根据时间为df1分配权重

如果df2的时间介于df1的开始和结束之间,则应为df1中的记录分配相应的权重。我可以简单地使用左连接,但问题是可能有两个或三个权重分配给同一个ID

df1:

df2:

预期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'], '')

如果我能得到一些帮助,我将不胜感激。

您无法比较pandas中不同数据帧中具有不同名称的两个系列。您必须更改名称或加入两个数据帧。在这种情况下,我相信加入是最好的选择。自
len(df1)!=len(df2)
加入数据帧后,您应该能够使用该代码。

您不能比较熊猫中不同数据帧中具有不同名称的两个系列。您必须更改名称或加入两个数据帧。在这种情况下,我相信加入是最好的选择。自
len(df1)!=len(df2)
加入数据帧后,您应该能够使用该代码。

您可以先尝试加入或合并两个帧。。。然后应用过滤器

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'])]
df1.set_索引('ID',inplace=True)
df2.set_索引('ID',in place=True)
df=df1.join(df2)
df_filtered=df[(df['TIME']>df['START'])和(df['TIME']
您可以先尝试连接或合并两个帧。。。然后应用过滤器

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'])]
df1.set_索引('ID',inplace=True)
df2.set_索引('ID',in place=True)
df=df1.join(df2)
df_filtered=df[(df['TIME']>df['START'])和(df['TIME']
如果
时间
不在
开始
结束
定义的时间间隔内,您希望发生什么?根据您的预期df,即使在那时您似乎也希望匹配。如果
时间
不在
开始
结束
定义的间隔内,您希望发生什么?基于你的预期df,即使在那时,你似乎也想要一场比赛。
ValueError: Can only compare identically-labeled Series objects
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'])]