根据另一个数据框中的两列过滤数据
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
中的 id
与 df1
中的 id
和 [=18= df1
中的特定 id
也匹配或落在 df
中的 start
和 end
之间。
我可以通过比较第二个数据帧 df1
中是否存在相同的 id
使用 :
轻松地从 df
中提取 id
df_filtered = df[(df['id'].isin(df1['id']))]
但我无法将 df1
的 date
与 df
的 start
和 end
进行比较。我想要的输出如下:
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'])]
我有以下两个数据框:
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
中的 id
与 df1
中的 id
和 [=18= df1
中的特定 id
也匹配或落在 df
中的 start
和 end
之间。
我可以通过比较第二个数据帧 df1
中是否存在相同的 id
使用 :
df
中提取 id
df_filtered = df[(df['id'].isin(df1['id']))]
但我无法将 df1
的 date
与 df
的 start
和 end
进行比较。我想要的输出如下:
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'])]