Python 基于多个条件替换groupby中的值

Python 基于多个条件替换groupby中的值,python,pandas,dataframe,Python,Pandas,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-0

我的问题与此相关,但我仍然不知道如何将答案应用于我的问题。我有这样一个数据帧:

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
对于每个
队列
,我想用
val
的最大值替换
val
的值,但仅用于
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
如果没有很多循环,我怎么做呢

  • 确定每组
    队列的
    val
    的最大值
  • 确定与
    val
  • 使用
    np执行矢量化比较和替换。其中

  • 我不太明白。对于第二行,2001-02-01大于2001-01-01,那么为什么该行的val也被替换?第二行的更改是因为
    日期小于与
    val
    最大值关联的日期。您是指每个组还是整个数据帧?是。。。。。。。。。。。。
    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