在熊猫列上执行迭代减法和除法运算的有效方法

时间:2018-12-29 21:27:39

标签: python-3.x pandas

我有以下数据框-

      A    B   C  Result
 0  232  120   9      91
 1  243  546   1      12
 2   12  120   5      53

我要执行以下类型的操作-

      A    B   C  Result   A-B/A+B   A-C/A+C   B-C/B+C
  0 232  120   9      91  0.318182  0.925311  0.860465
  1 243  546   1      12 -0.384030  0.991803  0.996344
  2  12  120   5      53 -0.818182  0.411765  0.920000

我正在使用

 df['A-B/A+B']=(df['A']-df['B'])/(df['A']+df['B'])
 df['A-C/A+C']=(df['A']-df['C'])/(df['A']+df['C'])
 df['B-C/B+C']=(df['B']-df['C'])/(df['B']+df['C']) 

我认为这是一个非常粗糙和丑陋的方式。 如何以更正确的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

# take columns in a list except the last column
colnames = df.columns.tolist()[:-1]

# compute 
for i, c in enumerate(colnames):
    if i != len(colnames):
        for k in range(i+1, len(colnames)):
            df[c + '_' + colnames[k]] = (df[c] - df[colnames[k]]) / (df[c] + df[colnames[k]])

# check result
print(df)

     A    B  C  Result       A_B       A_C       B_C
0  232  120  9      91  0.318182  0.925311  0.860465
1  243  546  1      12 -0.384030  0.991803  0.996344
2   12  120  5      53 -0.818182  0.411765  0.920000

答案 1 :(得分:1)

这是使用DataFrame.eval的完美案例:

cols = ['A-B/A+B','A-C/A+C','B-C/B+C']
x = pd.DataFrame([df.eval(col).values for col in cols], columns=cols)
df.assign(**x)

    A    B   C    Result  A-B/A+B     A-C/A+C     B-C/B+C
0  232  120  9      91  351.482759  786.753086  122.000000
1  243  546  1      12  240.961207  243.995885   16.583333
2   12  120  5      53  128.925000  546.998168  124.958333

此方法相对于其他解决方案的优点在于,它不依赖于以列名形式出现的操作顺序,而是如documentation中所述,它用于: / p>

  

计算一个字符串,描述对DataFrame列的操作。