我想从我的pandas DataFrame中选择记录在每个ID的特定日期之前的行。
我为每个ID设置了一些起征点日期:
thresholds = pd.DataFrame({'id':[1, 2, 3], 'threshold_date':pd.date_range('2019-01-01', periods = 3)})
thresholds
id threshold_date
0 1 2019-01-01
1 2 2019-01-02
2 3 2019-01-03
我有一个DataFrame,每个ID的阈值日期之后都有日期:
df = pd.DataFrame({'id':[1, 1, 2, 2, 3, 3], 'threshold_date':pd.date_range('2018-12-30', periods = 6), 'value': [0.1, 0.2, 0.3, 0.1, 0.2, 0.3]})
df
id threshold_date value
0 1 2018-12-30 0.1
1 1 2018-12-31 0.2
2 2 2019-01-01 0.3
3 2 2019-01-02 0.1
4 3 2019-01-03 0.2
5 3 2019-01-04 0.3
df = pd.DataFrame({'id':[1, 1, 2], 'threshold_date':pd.date_range('2018-12-30', periods = 3), 'value': [0.1, 0.2, 0.3]})
我想过滤我的DataFrame,以使每个ID的阈值日期之前只有一行:
df_filt = pd.DataFrame({'id':[1, 1, 2], 'threshold_date':pd.date_range('2018-12-30', periods = 3), 'value': [0.1, 0.2, 0.3]})
id threshold_date value
0 1 2018-12-30 0.1
1 1 2018-12-31 0.2
2 2 2019-01-01 0.3
我该怎么做?
答案 0 :(得分:2)
您可以将merge
与id
一起用于query
进行过滤:
(thresholds.merge(df,on='id',how='left',suffixes=('_x',''))
.query("threshold_date_x > threshold_date").reindex(columns=df.columns))
id threshold_date value
0 1 2018-12-30 0.1
1 1 2018-12-31 0.2
2 2 2019-01-01 0.3
答案 1 :(得分:0)
您可以为此使用以下条件:
mask = df['threshold_date'] < pd.to_datetime('2019-01-01') # the threshold date
df = df[mask]