You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中按ID分组,根据周期阈值修改DataFrame的Days列?

按分组最大周期值修改Pandas DataFrame列的实现方案

简洁实现方案

直接使用groupby.transform获取每个分组的最大周期值,结合np.where完成列修改,代码更紧凑:

import pandas as pd
import numpy as np

# 原始数据定义(省略重复代码,保留核心处理逻辑)
df = pd.DataFrame(data)

cycle_threshold = 8

# 核心处理代码
df['Days'] = np.where(
    df.groupby('id')['cycle'].transform('max') >= cycle_threshold,
    np.nan,
    df['Days']
)

print(df)

分步逻辑解释

  1. 获取分组最大周期:df.groupby('id')['cycle'].transform('max')会为原DataFrame的每一行生成对应id的最大cycle值,返回一个与原df行数一致的Series,无需额外合并操作。
  2. 条件赋值:np.where根据条件表达式判断:当最大周期≥阈值时,将Days设为np.nan;否则保留原Days数值。

分步拆解实现(适合新手理解)

如果需要更清晰的分步操作,可先计算分组最大周期再合并到原表:

import pandas as pd
import numpy as np

df = pd.DataFrame(data)
cycle_threshold = 8

# 1. 计算每个id对应的最大cycle值
id_max_cycle = df.groupby('id')['cycle'].max().reset_index(name='max_cycle')

# 2. 将分组结果合并回原DataFrame,确保每一行都能获取对应id的最大周期
df = df.merge(id_max_cycle, on='id', how='left')

# 3. 根据规则修改Days列
df['Days'] = np.where(df['max_cycle'] >= cycle_threshold, np.nan, df['Days'])

# 4. 删除临时辅助列(可选,保持数据整洁)
df = df.drop(columns='max_cycle')

print(df)

结果验证

  • id=1、id=5的最大cycle分别为11、9,均≥8,对应的Days值全部设为NA;
  • id=2、id=3、id=4的最大cycle分别为6、6、4,均<8,Days值保持原始数据不变。

内容的提问来源于stack exchange,提问作者NN_Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:57:49