基于索引的两个多级数据帧的乘法和加法

时间:2019-01-13 19:19:24

标签: python-3.x pandas

我有两个数据帧df1和df2。这两个数据帧具有相同的索引UNKNOWN,分别为step1,step2,step3。

df1:

FE             F1        F2
C_Step                     
UNKNOWN  0.336134  0.165289
step1    0.126050  0.371901
step2    0.201681  0.297521
step3    0.336134  0.165289

df2:

DT             D1                    D2               
RE             E1     E2        E3   E1   E2        E3
C_Step                                                
UNKNOWN  0.571429  0.000  0.219780  0.0  0.5  0.000000
step1    0.428571  0.000  0.164835  1.0  0.0  0.555556
step2    0.000000  0.375  0.395604  0.0  0.0  0.444444
step3    0.000000  0.625  0.219780  0.0  0.5  0.000000

我想对df1和df2的 EACH 列进行乘法和加法运算。生成的数据帧(df3)的结构如下所示(数据帧df1的每一列以及df2的每一列)。

1)所有 UNKNOWN 索引均应填充零。

2)其他索引:(df1 * df2的未知索引)+(df2 * df1的未知索引)

例如:在第一列中,
“未知”的值:0.00000

“ step1”索引的值:(0.126050 * 0.571429)+(0.428571 * 0.336134)= 0.21609

“ step2”的值: (0.201681 * 0.571429)+(0.00000 * 0.336134)= 0.11525

第3步的值: (0.336134 * 0.571429)+(0.0000 * 0.336134)= 0.19208

对于所有其他多级列依次如此

df3:示例

DT             D1                                 D2                      \
RE             E1        E2        E3             E1        E2        E3   
FE             F1   F2   F1   F2   F1        F2   F1   F2   F1   F2   F1   
C_Step                                                                     
UNKNOWN    0.00000  0    0    0    0         0    0    0.....
step1      0.21609 ...
step2      0.11525
step3      0.19208

DT                 
RE                 
FE             F2  
C_Step             
UNKNOWN        0
step1     
step2     
step3     

1 个答案:

答案 0 :(得分:0)

假设d1是第一个数据帧,d2是第二个数据帧。

import pandas as pd
from functools import reduce
from operator import mul
from itertools import product
#second multiplication
m1 = d1.copy()   #unknown values
s = m1.iloc[0].values
for i in range(0,4):
    m1.iloc[i] = s
m1.iloc[0] = 0    

#print(m1)    
m2 = d2.copy()  #unknown values
s = m2.iloc[0].values
for i in range(0,4):
    m2.iloc[i] = s
m2.iloc[0] = 0

#print(m2)    

second1 = pd.concat({k: reduce(mul, (d[c] for d, c in zip([d1, m2], k)))for k in product(d1, d2)}, axis=1)   
second2 = pd.concat({k: reduce(mul, (d[c] for d, c in zip([m1, d2], k)))for k in product(d1, d2)}, axis=1)   

#add dataframes together
summation = sum([second1, second2])