我有一个数据框A,它是一个简单的零件元素数据库:
A = pd.DataFrame(columns= ['name','attribute1','attribute2']...)
示例:
A = pd.DataFrame([('X', 1, 0.5),('Y', 0.5, 0.8),('Z', 0.4,0.1)])
下面的列表“索引”是长度为3的A中名称的所有可能组合的列表: 例如ABC,ACD,ARG等。
index = list((i,j,k) for ((i,_),(j,_),(k,_)) in itertools.combinations(enumerate(A['name']),3))
我在这里使用枚举是为了让我可以参考稍后生成的任何特定组合。
为了能够将组合放在一起,我有一个权重排列的列表,这些权重代表要应用于A中每个属性的所有可能的权重:
weights = list(itertools.permutations([-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10],3))
这会生成诸如[(1,2,3),(-2,4,1)..]等的权重
我需要一个与A具有相同结构的结果矩阵/数据框,其名称表示A的名称的组合,即。结果中的ABC和属性是权重与A中属性的线性组合,即。
A.dot(weight)
我尝试遍历写入各行,但是计算时间太长,例如下面的代码将无法工作:
for x in weights:
part1 = x[0]
part2 = x[1]
part3 = x[2]
q = 0
while q < len(results):
ind1 = results['index'][q][0]
ind2 = results['index'][q][1]
ind3 = results['index'][q][2]
results['name'][q] = ''.join((str(A['name'][ind1]),str(a['name'][ind2]),str(A['name'][ind3])))
results['attrib1'][q] = part1 * A['attrib1'][ind1]+part2*A['attrib1'][ind2] + part3*A['attrib1'][ind3]
results['attrib2'][q] = part1 * A['attrib2'][ind1]+part2*A['attrib2'][ind2] + part3*A['attrib2'][ind3]
所需结果示例:
Result = pd.DataFrame([('XYZ', -0.1, 0.5),('VTS', 0.5, 0.8),('AGT', 0.4,0.1)])
其中数字列中的值是元素的线性组合,使用上面权重列表中的一组特定权重。
有什么想法吗?