将一些行乘以Pandas数据帧中的其他行

时间:2018-02-23 03:06:41

标签: python pandas pandas-groupby

我应该如何完成以下"乘法"?我想要倍增" 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

现在,我唯一想到的是迭代地将行分解为键的唯一组合,并对每个组合进行乘法运算。我希望有一个想法或方向,我可以尝试,所以我不必迭代数据框。有数百种独特的组合。

2 个答案:

答案 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_VENDORkey1key2进行索引,然后进行计算:

key3