为了账号安全,请及时绑定邮箱和手机立即绑定

itertools:获取操作(+ - * /)和列的组合

itertools:获取操作(+ - * /)和列的组合

胡说叔叔 2023-03-01 15:31:35
给定一个数值数据框,我想对所有列组合执行加、减、乘和除。对于 3 及以上的组合,最快的方法是什么?下面给出了一个最小的可重现示例,其中包含 2。import numpy as npimport pandas as pdfrom itertools import combinationsfrom itertools import permutationsfrom sklearn.datasets import load_boston # the datasetX, y = load_boston(return_X_y=True)X = pd.DataFrame(X)combos2 = list(combinations(X.columns,2))perm3 = list(permutations(X.columns,3))  # how would i do this with out typing out all the permutationsfor i in combos2:    X[f'{i[0]}_X_{i[1]}'] = X.iloc[:,i[0]]*X.iloc[:,i[1]]  # Multiply    X[f'{i[0]}_+_{i[1]}'] = X.iloc[:,i[0]]+X.iloc[:,i[1]]  # Add    X[f'{i[0]}_-_{i[1]}'] = X.iloc[:,i[0]]-X.iloc[:,i[1]]  # Subtract    X[f'{i[0]}_/_{i[1]}'] = X.iloc[:,i[0]]/(X.iloc[:,i[1]]+1e-20)   # Divide我正在考虑一种将“运算符 + * - / 添加到组合中的方法,这样它可以用比手动输入所有组合更少的行来编写,但我不知道从哪里开始?我想要所有订单:即 (a * b + c) , (a * b - c) , (a * b / c) 等理想情况下不要留下重复的列。即(a + b + c)和(c + b + a)例如,如果我有 3 列 ab c。我想要一个新列 (a * b + c)。
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我希望这会帮助您入门:


operators = ['-', '+', '*', '/']

operands = ['a', 'b', 'c']


# find out all possible combination of operators first. So if you have 3 operands, that would be all permutations of the operators, taken 2 at a time. Also append the same expression operator combinations to the list


from itertools import permutations

operator_combinations = list(permutations(operators, len(operands)-1))

operator_combinations.extend([op]*(len(operands)-1) for op in operators)


# create a list for each possible expression, appending it with an operand and then an operator and so on, finishing off with an operand.


exp = []

for symbols in operator_combinations:

    temp = []

    for o,s in zip(operands, symbols):

        temp.extend([o,s])

    temp.append(operands[-1])

    exp.append(temp)


for ans in exp:

    print(''.join(ans))

输出 :


a-b+c

a-b*c

a-b/c

a+b-c

a+b*c

a+b/c

a*b-c

a*b+c

a*b/c

a/b-c

a/b+c

a/b*c

a-b-c

a+b+c

a*b*c

a/b/c


查看完整回答
反对 回复 2023-03-01
?
慕慕森

TA贡献1856条经验 获得超17个赞

这是一个天真的解决方案,它输出所有列的 2 和 3 的组合。

  1. 组合列表

  2. 使用 operator 包创建一个函数

  3. for循环组合

  4. 这可能有重复的列,因此删除重复项

from sklearn.datasets import load_boston 

from itertools import combinations

import operator as op 


X, y = load_boston(return_X_y=True)

X =  pd.DataFrame(X)


comb= list(combinations(X.columns,3))


def operations(x,a,b):

   if (x == '+'): 

      d =  op.add(a,b) 

   if (x == '-'): 

      d =  op.sub(a,b) 

   if (x == '*'): 

      d =  op.mul(a,b)     

   if (x == '/'): # divide by 0 error

      d =  op.truediv(a,(b + 1e-20)) 

   return d



for x in ['*','/','+','-']:

  for y in ['*','/','+','-']:

    for i in comb:

      a = X.iloc[:,i[0]].values

      b = X.iloc[:,i[1]].values

      c = X.iloc[:,i[2]].values

      d = operations(x,a,b)

      e = operations(y,d,c)

      X[f'{i[0]}{x}{i[1]}{y}{i[2]}'] = e

      X[f'{i[0]}{x}{i[1]}'] = d


X = X.loc[:,~X.columns.duplicated()]


查看完整回答
反对 回复 2023-03-01
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号