Выбор строк в pandas на основе пороговой даты для идентификатора - PullRequest
1 голос
/ 10 января 2020

Я хочу выбрать строки из моего pandas DataFrame, где записи находятся перед определенной датой для каждого идентификатора.

У меня есть некоторые пороговые даты для каждого идентификатора:

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

I иметь DataFrame с датами после пороговой даты для каждого идентификатора:

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, чтобы у меня были только строки до пороговой даты для каждого идентификатора:

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 ]

2 голосов
/ 10 января 2020

Вы можете использовать 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
0 голосов
/ 10 января 2020

Для этого вы можете использовать условие, подобное следующему:

mask = df['threshold_date'] < pd.to_datetime('2019-01-01') # the threshold date 
df = df[mask]
...