【问题标题】:Efficient way to perform iterative subtraction and division operations on pandas columns在熊猫列上执行迭代减法和除法运算的有效方法
【发布时间】:2018-12-30 08:12:54
【问题描述】:

我有以下数据框-

      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']) 

我认为这是一种非常粗糙和丑陋的做法。 怎么做才更正确?

【问题讨论】:

  • 您已经以正确且(恕我直言)最好的方式进行操作。
  • 但是如果我们增加编号。列那么你不认为它会变得有点低效
  • 它高效(矢量化)且不言自明。你认为什么是“漂亮”?
  • @LukaszTracewski 我更多的是寻找一种循环的方法,以防万一。列数增加。
  • 好的,现在我也明白你想要达到的目的了。我以为您想遍历行,这不是一个好主意。 Yolo 的解决方案对我来说似乎不错。

标签: python-3.x pandas


【解决方案1】:

您可以执行以下操作:

# 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

【讨论】:

    【解决方案2】:

    这是使用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 中所述,它用于:

    评估一个描述对 DataFrame 列的操作的字符串。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2021-09-12
      • 2017-12-11
      • 2023-03-22
      • 2016-09-18
      相关资源
      最近更新 更多