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

如何在Pandas中使用apply方法一次性新增6列自定义计算结果

正确实现方案

第一步:修正自定义函数问题

你当前定义的Rx函数存在两个问题:没有接收行参数、缺少除零异常捕获,修正后的代码如下:

def Rx(row):
    O,C,H,L = row['O'], row['C'], row['H'], row['L']
    P1,P4 = H,L
    P2,P3 = (C,O) if O < C else (O,C)
    D1 = P1-P2
    D2 = P2-P3
    D3 = P3-P4

    # 通用除零处理逻辑
    def safe_cal(a,b):
        try:
            return a/b
        except ZeroDivisionError:
            return 1
    
    R1 = safe_cal(D1,D2)
    R2 = safe_cal(D1,D3)
    R3 = safe_cal(D2,D1)
    R4 = safe_cal(D2,D3)
    R5 = safe_cal(D3,D1)
    R6 = safe_cal(D3,D2)
    return R1,R2,R3,R4,R5,R6

第二步:正确赋值多列

你之前的写法错误将6个列名合并为单个字符串,pandas会识别为单列,需要用列表拆分每个列名,同时给apply方法添加result_type='expand'参数,自动把返回的元组拆分为多列:

df[['R1','R2','R3','R4','R5','R6']] = df.apply(Rx, axis=1, result_type='expand')

可选:大数据量优化方案

如果你的数据量超过10万行,按行遍历的apply方法性能较低,可以改用向量化计算,不需要遍历每行,运行效率提升数十倍:

import numpy as np
O,C,H,L = df['O'], df['C'], df['H'], df['L']
P1,P4 = H,L
P2 = np.where(O<C, C, O)
P3 = np.where(O<C, O, C)
D1 = P1-P2
D2 = P2-P3
D3 = P3-P4

df['R1'] = np.where(D2==0, 1, D1/D2)
df['R2'] = np.where(D3==0, 1, D1/D3)
df['R3'] = np.where(D1==0, 1, D2/D1)
df['R4'] = np.where(D3==0, 1, D2/D3)
df['R5'] = np.where(D1==0, 1, D3/D1)
df['R6'] = np.where(D2==0, 1, D3/D2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:06:02