根据另一个数据框中的两列过滤数据

Filter data based on two columns from another dataframe

我有以下两个数据框:

df = pd.DataFrame({
    'id': ['1', '1', '2', '3', '3', '8','4', '1', '2', '4'],
    'start': ['2017-01-01', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-04-01', '2017-01-01', '2017-04-01', '2017-05-01', '2017-02-01'],
    'end': ['2017-01-02', '2017-02-4', '2017-03-02', '2017-02-06', '2017-03-01', '2017-04-03', '2017-01-06', '2017-04-08', '2017-05-04', '2017-02-01']    
})

df1 = pd.DataFrame({
    'date': ['2017-01-02', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-04-01'],
    'id': ['1', '2', '3','4', '5', '6']       
})

我只想从 df 中提取 df 中的 iddf1 中的 id 和 [=18= df1 中的特定 id 也匹配或落在 df 中的 startend 之间。
我可以通过比较第二个数据帧 df1 中是否存在相同的 id 使用 :

轻松地从 df 中提取 id
df_filtered = df[(df['id'].isin(df1['id']))]

但我无法将 df1datedfstartend 进行比较。我想要的输出如下:

  id      start        end
0  1 2017-01-01 2017-01-02
4  3 2017-03-01 2017-03-01
9  4 2017-02-01 2017-02-01

日期、开始和结束列已采用日期时间格式 Y-M-D。任何帮助将不胜感激。

你可能想要 merge

df.merge(df1, on='id', how='inner')

        end id       start        date
 0  2017-01-02  1  2017-01-01  2017-01-02
 1   2017-02-4  1  2017-02-01  2017-01-02
 2  2017-04-08  1  2017-04-01  2017-01-02
 3  2017-03-02  2  2017-03-01  2017-02-01
 4  2017-05-04  2  2017-05-01  2017-02-01
 5  2017-02-06  3  2017-02-01  2017-03-01
 6  2017-03-01  3  2017-03-01  2017-03-01
 7  2017-01-06  4  2017-01-01  2017-02-01
 8  2017-02-01  4  2017-02-01  2017-02-01

然后比较列

合并和过滤:

df2 = df.merge(df1)
df2[(df2['date']>=df2['start'])&(df2['date']<=df2['end'])]