【问题标题】:Multiplication and addition of two multilevel data-frame based on index基于索引的两个多级数据帧的乘法和加法
【发布时间】:2019-06-07 21:36:33
【问题描述】:

我有两个数据框 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

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

1) 所有 UNKNOWN 索引都应该用零填充。

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

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

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

“步骤 2”的值: (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     

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    假设 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])
    

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2020-05-19
      相关资源
      最近更新 更多