【发布时间】:2018-11-13 19:05:20
【问题描述】:
我有两个这样的数据框。
df1
MainId,Time,info1,info2
100,2018-07-12 08:05:00,a,b
100,2018-07-12 08:07:00,x,y
101,2018-07-14 16:00,c,d
100,2018-07-14 19:30:00,d,e
104,2018-07-14 03:30:00,g,h
和
df2
Id,MainId,startTime,endTime,value
1,100,2018-07-12 08:00:00,2018-07-12 08:10:00,1001
2,150,2018-07-14 10:05:00,2018-07-14 17:05:00,1002
3,101,2018-07-12 0:05:00,2018-07-12 19:05:00,1003
4,100,2018-07-12 08:05:00,2018-07-12 08:15:00,1004
df2 是主数据帧,df1 是子数据帧。我想检查df2 的starttime 和endtime 以及df1 中的时间与MainId。如果df1.Time isin df2(start and endtime) 对应于MainId,那么我想将df1 的info1 和info2 列包含到df2。如果没有值,那么我只想输入 nan。
我想要这样的输出
Id,MainId,info1,info2,value
1,100,a,b,1001
1,100,x,y,1001
2,150,nan,nan,1002
3,101,nan,nan,1003
4,100,a,b,1004
4,100,x,y,1004
这里我在输出中有两个相同的 Id(In Id1) 和 MainId,因为它们有不同的 info1 和 info2,我也想包含那个。
这就是我在 pandas 中所做的事情
df2['info1'] = np.where((df2['MainId'] == df1['MainId'])& (df1['Time'].isin([df2['startTime'], df2['endTime']])),df1['info1'], np.nan)
但它会抛出错误
ValueError: Can only compare identically-labeled Series objects
我该如何解决这个错误?有没有更好的办法 ?
【问题讨论】:
-
您应该合并
on=MainId,然后使用布尔掩码查找时间间隔。它与this answer 非常相似,尽管在这种情况下您只是基于MainId进行合并 -
@ALollz 我首先尝试使用
merge,但我发现的问题是,合并后,在时间为(开始和结束)时选择数据时,可能有些原始来自df2的数据丢失。我需要从df2返回所有数据(问题的预期输出)