我有一个数据框,我需要根据另一数据框的开始日期和结束日期过滤日期。
df1的all_dates必须在df2的start_date和end_date范围内
示例集如下。熊猫实现这一目标的最佳方法是什么?
考虑以下示例数据帧,我已经包含了预期的结果集
df1
ID all_date clicks
1 2019-08-21 5
1 2019-08-22 4
1 2019-08-25 2
1 2019-08-27 2
2 2019-07-18 5
2 2019-07-21 5
2 2019-07-23 6
2 2019-07-25 6
2 2019-07-27 6
df2
ID start_date end_date
1 2019-08-21 2019-08-23
2 2019-07-18 2019-07-24
expected output:
df1
ID all_date clicks
1 2019-08-21 5
1 2019-08-22 4
2 2019-07-18 5
2 2019-07-21 5
2 2019-07-23 6
输出应包含日期范围,即df2的开始日期和结束日期
答案 0 :(得分:1)
首先使用DataFrame.merge
并按Series.between
和loc
进行过滤,以按列名和boolean indexing
进行过滤:
df1['all_date'] = pd.to_datetime(df1['all_date'])
df2['start_date'] = pd.to_datetime(df2['start_date'])
df2['end_date'] = pd.to_datetime(df2['end_date'])
df = df1.merge(df2, on='ID')
df = df.loc[df['all_date'].between(df['start_date'], df['end_date']), df1.columns]
print (df)
ID all_date clicks
0 1 2019-08-21 5
1 1 2019-08-22 4
4 2 2019-07-18 5
5 2 2019-07-21 5
6 2 2019-07-23 6