根据每个ID的阈值日期选择熊猫中的行

时间:2020-01-10 12:00:50

标签: python pandas dataframe data-analysis

我想从我的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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以将mergeid一起用于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]