给定一个数值的数据框,我想对所有列组合执行加,减,乘和除运算。
对于3以上的组合,最快的方法是什么?
下面给出了一个最小的可重现示例(组合为2)。
import numpy as np
import pandas as pd
from itertools import combinations
from itertools import permutations
from sklearn.datasets import load_boston
# the dataset
X, 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 permutations
for 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和3的组合。
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()]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句