我应该如何完成以下"乘法"?我想要倍增" X" by" Y"并将其存储为" Z"。
我使用三列的组合来确定要乘的两行,并使用选择列来确定要乘以哪两行。最后,我将两个值相乘。看起来像这样::
df = pd.DataFrame({'key1':['A','A','A','A'],
'key2':['B','B','B','B'],
'key3':['C','C','D','D'],
'val1':[10,11,30,-3],
'val2':[20,25,40,-2],
'sel':['X','Y','X','Y']})
key1 key2 key3 sel val1 val2
0 A B C X 10 20
1 A B C Y 11 25
2 A B D X 30 40
3 A B D Y -3 -2
为了决定要乘以哪些记录,我使用三个键。在这种情况下,记录0具有键A,B和C以及sel = X.我想通过具有键A,B和C以及sel = Y的其他记录进行元素乘法。 因此,val1的结果为10x11,val2的结果为20 * 25。还应该创建另一条记录(ABDX次ABDY),其中val1 = 30 * -3且val2 = 40 * -2
key1 key2 key3 sel val1 val2
0 A B C Z 110 500
1 A B D Z -90 -80
现在,我唯一想到的是迭代地将行分解为键的唯一组合,并对每个组合进行乘法运算。我希望有一个想法或方向,我可以尝试,所以我不必迭代数据框。有数百种独特的组合。
答案 0 :(得分:3)
IIUC,您只需groupby
您的密钥,然后prod
:
In [34]: p = df.groupby(['key1', 'key2', 'key3'], as_index=False).prod()
In [35]: p
Out[35]:
key1 key2 key3 val1 val2
0 A B C 110 500
1 A B D -90 -80
然后,你可以用几种不同的方式添加sel = Z,无论是直接赋值还是使用.insert
(更短但更不常见)。例如:
In [38]: p = df.groupby(['key1', 'key2', 'key3'], as_index=False).prod()
In [39]: p.assign(sel='Z').reindex(columns=df.columns)
Out[39]:
key1 key2 key3 sel val1 val2
0 A B C Z 110 500
1 A B D Z -90 -80
答案 1 :(得分:1)
设置ENGINE_VENDOR
,key1
,key2
进行索引,然后进行计算:
key3