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

如何用Python按分组ID及Cycle阈值设置Salary列的0/1值?

根据ID分组设置Salary列值的Python实现方案

问题描述

现有如下Python数据集并已转换为DataFrame:

import pandas as pd

# Create dataset
data = {'id': [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
        'cycle': [1, 2, 3, 4, 5,6,7,8,9, 1, 2, 3,4,5,6, 1, 2, 3, 4,5,6,7,8],
        'Salary': [0, 0, 0,  0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        'Days': [123, 128, 66, 120, 141, 128, 66, 120, 141, 52,96, 120, 141, 52,96, 120, 141,123,15,85,36,58,89],
        }

# Convert to dataframe
df = pd.DataFrame(data)

需要针对每个id分组,根据Cycle阈值设置Salary列值:

  • id=1时,cycle>=4则Salary设为1
  • id=2时,cycle>=3则Salary设为1
  • id=3时,cycle>=6则Salary设为1

实现方法

方法1:字典映射 + 布尔索引

这种方法高效直观,适合简单的映射逻辑:

# 定义id与cycle阈值的映射关系
threshold_map = {1:4, 2:3, 3:6}

# 遍历每个id及其阈值,批量赋值
for id_val, threshold in threshold_map.items():
    df.loc[(df['id'] == id_val) & (df['cycle'] >= threshold), 'Salary'] = 1

# 查看结果
print(df)

方法2:使用np.select多条件判断

可读性强,适合条件较多的场景:

import numpy as np

# 定义条件列表和对应赋值
conditions = [
    (df['id'] == 1) & (df['cycle'] >= 4),
    (df['id'] == 2) & (df['cycle'] >= 3),
    (df['id'] == 3) & (df['cycle'] >= 6)
]
values = [1, 1, 1]

# 应用条件,未满足条件的行保留原Salary值
df['Salary'] = np.select(conditions, values, default=df['Salary'])

方法3:分组后自定义函数处理

扩展性强,适合后续有更复杂分组逻辑的场景:

def set_salary(group):
    id_val = group['id'].iloc[0]
    if id_val == 1:
        group.loc[group['cycle'] >=4, 'Salary'] =1
    elif id_val ==2:
        group.loc[group['cycle'] >=3, 'Salary'] =1
    elif id_val ==3:
        group.loc[group['cycle'] >=6, 'Salary'] =1
    return group

df = df.groupby('id').apply(set_salary).reset_index(drop=True)

以上三种方法均可实现需求,其中方法1在数据量较大时性能最优,方法2和3更适配复杂逻辑场景。


内容的提问来源于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.27 23:47:08