Заменить значения в группе на основе нескольких условий - PullRequest
0 голосов
/ 18 мая 2018

Мой вопрос связан с этим одним , но я все еще не понимаю, как я могу применить ответ к своей проблеме.У меня есть DataFrame примерно так:

df = pd.DataFrame({
    'date': ['2001-01-01', '2001-02-01', '2001-03-01', '2001-04-01', '2001-02-01', '2001-03-01', '2001-04-01'],
    'cohort': ['2001-01-01', '2001-01-01', '2001-01-01', '2001-01-01', '2001-02-01', '2001-02-01', '2001-02-01'],
    'val': [100, 101, 102, 101, 200, 201, 201]
})

df
    date        cohort      val
0   2001-01-01  2001-01-01  100
1   2001-02-01  2001-01-01  101
2   2001-03-01  2001-01-01  102
3   2001-04-01  2001-01-01  101
4   2001-02-01  2001-02-01  200
5   2001-03-01  2001-02-01  201
6   2001-04-01  2001-02-01  201

Группировка для каждого cohort, я хочу заменить значения val на максимальное значение val, но только для наблюдений, где dateменьше date, связанного с максимальным значением val.Поэтому строки 0, 1 и 4 будут изменены так, чтобы они выглядели так:

df #This is what I want my final df to look like 
    date        cohort      val
0   2001-01-01  2001-01-01  102
1   2001-02-01  2001-01-01  102
2   2001-03-01  2001-01-01  102
3   2001-04-01  2001-01-01  101
4   2001-02-01  2001-02-01  201
5   2001-03-01  2001-02-01  201
6   2001-04-01  2001-02-01  201

Как я могу сделать это без большого количества циклов?

1 Ответ

0 голосов
/ 18 мая 2018
  1. Определите максимальное значение val НА ГРУППУ cohort
  2. Определите максимальную дату, связанную с val
  3. Выполните векторизованное сравнение и замену на np.where

v = df.groupby('cohort').val.transform('max')
df['val'] = np.where(
    df.date <= df.set_index('cohort').val.idxmax(), v, df.val
)

df
    date        cohort      val
0   2001-01-01  2001-01-01  102
1   2001-02-01  2001-01-01  102
2   2001-03-01  2001-01-01  102
3   2001-04-01  2001-01-01  101
4   2001-02-01  2001-02-01  201
5   2001-03-01  2001-02-01  201
6   2001-04-01  2001-02-01  201
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...