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

在Pandas DataFrame中按组匹配列值生成新列C_t的实现方案

分组生成C_t列的实现方法

需求分析

现有按Race_ID分组、每组adv列已降序排序的数据集,需为每组生成新列C_t:

  • 找到最后一个满足adv_(n+1) ≤ C_n的C_k值(adv_(n+1)为当前行的下一行adv值,C_n为当前行的C_k值)
  • 若无符合条件的值,C_t设为1.0

原数据集

Race_ID   Date           adv          C_k
1         1/1/2023       2.5          2.7     
1         1/1/2023       1.4          2.6     
1         1/1/2023       1.3          1.9     
1         1/1/2023       1.1          1.2     
2         11/9/2022      1.4          1.1     
2         11/9/2022      1.3          1.2     
2         11/9/2022      1.0          0.4     
3         17/4/2022      0.9          0.2     
3         17/4/2022      0.8          0.4     
3         17/4/2022      0.7          0.5     
3         17/4/2022      0.6          0.2     
3         17/4/2022      0.5          0.4     

期望输出

Race_ID   Date           adv          C_k     C_t
1         1/1/2023       2.5          2.7     1.9      
1         1/1/2023       1.4          2.6     1.9     
1         1/1/2023       1.3          1.9     1.9     
1         1/1/2023       1.1          1.2     1.9     
2         11/9/2022      1.4          1.1     1.2     
2         11/9/2022      1.3          1.2     1.2     
2         11/9/2022      1.0          0.4     1.2     
3         17/4/2022      0.9          0.2     1.0     
3         17/4/2022      0.8          0.4     1.0     
3         17/4/2022      0.7          0.5     1.0     
3         17/4/2022      0.6          0.2     1.0     
3         17/4/2022      0.5          0.4     1.0     

实现方法(Python Pandas)

通过分组后自定义函数处理每组数据:

import pandas as pd

# 构造或读取原数据集
df = pd.DataFrame({
    'Race_ID': [1,1,1,1,2,2,2,3,3,3,3,3],
    'Date': ['1/1/2023']*4 + ['11/9/2022']*3 + ['17/4/2022']*5,
    'adv': [2.5,1.4,1.3,1.1,1.4,1.3,1.0,0.9,0.8,0.7,0.6,0.5],
    'C_k': [2.7,2.6,1.9,1.2,1.1,1.2,0.4,0.2,0.4,0.5,0.2,0.4]
})

def calculate_ct(group):
    # 计算条件:下一行的adv <= 当前行的C_k
    condition = group['adv'].shift(-1) <= group['C_k']
    # 筛选出所有满足条件的行
    valid_rows = group[condition]
    if not valid_rows.empty:
        # 取最后一个满足条件的行的C_k值
        ct_value = valid_rows['C_k'].iloc[-1]
    else:
        # 无满足条件的,设为1.0
        ct_value = 1.0
    # 为整组赋值C_t列
    group['C_t'] = ct_value
    return group

# 分组应用函数,生成结果
result_df = df.groupby('Race_ID', group_keys=False).apply(calculate_ct)

# 打印结果
print(result_df.to_string(index=False))

代码说明

  1. 分组处理:按Race_ID分组,对每组单独计算C_t值
  2. 条件判断:使用shift(-1)获取下一行的adv值,与当前行的C_k比较生成布尔序列
  3. 取值逻辑:
    • 若存在满足条件的行,取最后一行的C_k作为整组的C_t值
    • 若没有满足条件的行,C_t设为1.0
  4. 整组赋值:将计算得到的C_t值赋值给当前组的所有行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:14:53