给出一个带有标识符和时间戳列的DataFrame
:
DF1:
id visited
X 2019-01-07T01:23:45.678
X 2019-01-08T01:23:45.678
Y 2019-01-08T03:44:54.789
以及具有类似属性的单独DataFrame:
DF2:
id visited
X 2019-01-01T05:23:45.678
Y 2019-01-08T06:44:54.789
Y 2019-01-09T09:11:23.476
Z 2019-01-03T08:12:12.678
如何仅对相应id
列的第二个DataFrame(DF2)中时间戳早于时间戳的那些行过滤第一个DataFrame(DF1)? >
结果数据集将是:
id visited
Y 2019-01-08T03:44:54.789
注意:X
项被过滤掉,因为DF2中的时间戳早于DF1中的时间戳(而不是之后)。
预先感谢您的考虑和答复。
答案 0 :(得分:2)
我们可以使用merge_asof
df2['Have']=True
s=pd.merge_asof(df1.sort_values('visited'),df2.sort_values('visited'),on='visited',by='id',direction = 'forward')
id visited Have
0 X 2019-01-07 01:23:45.678 NaN
1 X 2019-01-08 01:23:45.678 NaN
2 Y 2019-01-08 03:44:54.789 True
#s=s[s.Have].copy()
答案 1 :(得分:2)
首先,将DF2中的“已访问”列重命名为“已访问_2”。然后合并id上的两个数据帧。最后,在“ visited_2”之前选择时间戳为“ visited”的数据,并保留所需的列。
DF2.rename(columns={'visited': 'visited_2'}, inplace=True)
DF = pd.merge(DF1, DF2, on=['id'])
DF.loc[DF['visited'] < DF['visited_2'], ['id', 'visited']]