如何基于另一个过滤一个数据帧

时间:2019-08-22 11:39:57

标签: python python-3.x pandas pandasql

我有一个数据框,我需要根据另一数据框的开始日期和结束日期过滤日期。

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的开始日期和结束日期

1 个答案:

答案 0 :(得分:1)

首先使用DataFrame.merge并按Series.betweenloc进行过滤,以按列名和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