【问题标题】:Replace values within a groupby based on multiple conditions根据多个条件替换 groupby 中的值
【发布时间】:2018-10-29 07:28:25
【问题描述】:

我的问题与one 有关,但我仍然没有看到如何将答案应用于我的问题。我有一个像这样的 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

如何在没有大量循环的情况下做到这一点?

【问题讨论】:

  • 不确定我是否关注。对于第二行,2001-02-01 大于 2001-01-01,那么为什么还要替换该行的 val 呢?
  • 第二行发生变化,因为date 小于与val 最大值关联的日期。
  • 您是指每个组还是整个 DataFrame?
  • 是的............

标签: python pandas dataframe


【解决方案1】:
  1. 确定val PER GROUP of 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2020-05-28
    • 2019-07-31
    • 2022-01-19
    相关资源
    最近更新 更多