熊猫中的多列计算

时间:2018-11-21 16:58:10

标签: pandas

我有一个很长的代数公式,需要将其应用于数据框:

def experience_mod(A, B, C, D, T, W):
    E = (T-A)
    F = (C-D)

    xmod = (A + B + (E*W) + ((1-W)*F))/(D + B + (F*W) + ((1-W)*F))

    return xmod

A = loss['actual_primary_losses']
B = loss['ballast']
C = loss['ExpectedLosses']
D = loss['ExpectedPrimaryLosses']
T = loss['ActualIncurred']
W = loss['weight']

我该如何编写此代码以计算每一行的experience_mod()?

像这样吗?

loss['ExperienceRating'] = loss.apply(experience_mod(A,B,C,D,T,W) axis = 0)

1 个答案:

答案 0 :(得分:2)

Pandas及其正在使用的底层库numpy支持向量化操作,因此,给定两个数据框A和B,A + BA - B等操作是有效的。

您的代码可以正常工作,您需要将函数直接应用于列并将结果分配回新列ExperienceRating


这是一个可行的示例:

In [1]: import pandas as pd 

In [2]: import numpy as np 

In [3]: df = pd.DataFrame(np.random.randn(6,6), columns=list('ABCDTW'))

In [4]: df
Out[4]: 
          A         B         C         D         T         W
0  0.049617  0.082861  2.289549 -0.783082 -0.691990 -0.071152
1  0.722605  0.209683 -0.347372  0.254951  0.468615 -0.132794
2 -0.301469 -1.849026 -0.334381 -0.365116 -0.238384 -1.999025
3 -0.554925 -0.859044 -0.637079 -1.040336  0.627027 -0.955889
4 -2.024621 -0.539384  0.006734  0.117628 -0.215070 -0.661466
5  1.942926 -0.433067 -1.034814 -0.292179  0.744039  0.233953

In [5]: def experience_mod(A, B, C, D, T, W):
   ...:     E = (T-A)
   ...:     F = (C-D)
   ...: 
   ...:     xmod = (A + B + (E*W) + ((1-W)*F))/(D + B + (F*W) + ((1-W)*F))
   ...: 
   ...:     return xmod
   ...: 

In [6]: experience_mod(df["A"], df["B"], df["C"], df["D"], df["T"], df["W"])
Out[6]: 
0    1.465387
1   -2.060483
2    1.000469
3    1.173070
4    7.406756
5   -0.449957
dtype: float64

In [7]: df['ExperienceRating'] = experience_mod(df["A"], df["B"], df["C"], df["D"], df["T"], df["W"])

In [8]: df
Out[8]: 
          A         B         C         D         T         W  ExperienceRating
0  0.049617  0.082861  2.289549 -0.783082 -0.691990 -0.071152          1.465387
1  0.722605  0.209683 -0.347372  0.254951  0.468615 -0.132794         -2.060483
2 -0.301469 -1.849026 -0.334381 -0.365116 -0.238384 -1.999025          1.000469
3 -0.554925 -0.859044 -0.637079 -1.040336  0.627027 -0.955889          1.173070
4 -2.024621 -0.539384  0.006734  0.117628 -0.215070 -0.661466          7.406756
5  1.942926 -0.433067 -1.034814 -0.292179  0.744039  0.233953         -0.449957