在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))
代码说明
- 分组处理:按
Race_ID分组,对每组单独计算C_t值 - 条件判断:使用
shift(-1)获取下一行的adv值,与当前行的C_k比较生成布尔序列 - 取值逻辑:
- 若存在满足条件的行,取最后一行的
C_k作为整组的C_t值 - 若没有满足条件的行,
C_t设为1.0
- 若存在满足条件的行,取最后一行的
- 整组赋值:将计算得到的
C_t值赋值给当前组的所有行
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

