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

基于ID1+ID2分组,用首个old值替换new值的Pandas实现问题

分组替换Pandas DataFrame中指定值的解决方案

原始DataFrame

import pandas as pd

df1 = pd.DataFrame({
    "ID1" : [1]*12 + [2]*12 + [3]*12,
    "ID2" : ["A"]*4 + ["B"]*4 + ["C"]*4 + ["A"]*4 + ["B"]*4 + ["C"]*4 + ["A"]*4 + ["B"]*4 + ["C"]*4,
    "value" : [1,2,3,4,10,20,30,40,100,200,300,400,
               11,12,13,14,101,202,303,404,1001,2002,3003,4004,
               15,23,33,45,107,204,302,405,1005,2006,3070,4080],
    "label": ["old", "new","old", "new","old", "new","old", "new","old", "new","old", "new",
              "old", "new","old", "new","old", "new","old", "new","old", "new","old", "new",
              "old", "new","old", "new","old", "new","old", "new","outdated", "new","outdated", "new"]
})

需求说明

针对ID1与ID2的每一组组合,完成以下操作:

  • 找到该组内第一个label为old或outdated对应的value值
  • 将该组内所有label为new的value替换为上述找到的值
  • 保留label为old/outdated的原始value不变

尝试的错误代码

def new_f(df_group):
    if df_group['label'=='new']:
        df_group['modified'] = df_group['value'][0]
    else:
        df_group['modified'] = df_group['value']

df2 = df1.groupby(["ID1","ID2"],as_index = False ).apply(new_f)

可行解决方案

方法1:使用groupby+transform(高效简洁)

# 定义函数:提取每组第一个old/outdated对应的value
def get_first_valid(group):
    return group[group['label'].isin(['old', 'outdated'])]['value'].iloc[0]

# 为每行生成对应的组内替换基准值
df1['base_val'] = df1.groupby(['ID1', 'ID2'])['value'].transform(get_first_valid)

# 根据label替换value
df1['value'] = df1.apply(
    lambda row: row['base_val'] if row['label'] == 'new' else row['value'],
    axis=1
)

# 移除临时辅助列(可选)
df1.drop('base_val', axis=1, inplace=True)

print(df1)

方法2:修正自定义函数结合apply

def process_group(df_group):
    # 获取组内第一个有效基准值
    first_old_val = df_group[df_group['label'].isin(['old', 'outdated'])]['value'].iloc[0]
    # 对组内new标签的行替换value
    df_group.loc[df_group['label'] == 'new', 'value'] = first_old_val
    return df_group

df2 = df1.groupby(['ID1', 'ID2'], as_index=False).apply(process_group)
print(df2)

核心说明

  • 两种方法的核心逻辑一致:先按组定位第一个old/outdated的value作为基准,再对组内new标签的行批量替换
  • 方法1的transform可以自动对齐索引,无需手动处理分组后的结构,更适合大规模数据集
  • 原错误代码的问题在于逻辑判断语法错误(df_group['label'=='new']写法错误),且未正确筛选行进行赋值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:20:31