如何在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
相关产品推荐
相关产品推荐

