代码之家  ›  专栏  ›  技术社区  ›  Joseph P Nardone

将特定列乘以行中的值

  •  0
  • Joseph P Nardone  · 技术社区  · 6 年前

    例如:

              X         Y         Z
    A 10      1         0         1        
    B 50      0         0         0      
    C 80      1         1         1
    

    将变成:

                  X         Y         Z
    A 10        10         0         10        
    B 50        0          0         0      
    C 80        80         80        80
    

    我遇到的问题是,当我使用mul()时,它超时了。我真正的数据集非常大。我尝试在我的真实代码中使用循环进行迭代,如下所示:

    for i in range(1,df_final_small.shape[0]): 
        df_final_small.iloc[i].values[3:248] = df_final_small.iloc[i].values[3:248] * df_final_small.iloc[i].values[2]
    

    for i in range(1,df_final_small.shape[0]): 
        df_final_small.iloc[i].values[1:4] = df_final_small.iloc[i].values[1:4] * df_final_small.iloc[i].values[0]
    

    一定有更好的方法来做到这一点,我有问题,找出如何只投乘法的某些列中的行,而不是整个行。

    编辑: 这里更详细的是我的df.head(5)。

    id  gross   150413 Welcome Email    150413 Welcome Email Repeat Cust    151001 Welcome Email    151001 Welcome Email Repeat Cust    161116 eKomi    1702 Hot Leads Email    1702 Welcome Email - All Purchases  1804 Hot Leads  ... SILVER  GOLD    PLATINUM    Acquisition Direct Mail Conversion Direct Mail  Retention Direct Mail   Retention eMail cluster x   y
    0   0033333 46.2    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 10  -0.230876   0.461990
    1   0033331 2359.0  0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 9   0.231935    -0.648713
    2   0033332 117.0   0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5   -0.812921   -0.139403
    3   0033334 89.0    0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5   -0.812921   -0.139403
    4   0033335 1908.0  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 1.0 0.0 0.0 7   -0.974142   0.145032
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   mad_    6 年前

    只需指定要相乘的列。例子

    df=pd.DataFrame({'A':10,'X':1,'Y':1,'Z':1},index=[1])
    df.loc[:,['X', 'Y', 'Z']]=df.loc[:,['X', 'Y', 'Z']].values*df.iloc[:,0:1].values
    

    range_of_columns= range(10,5001)+range(5030,10001)
    df.iloc[:,range_of_columns].values*df.iloc[:,0:1].values #multiplying the range of columns with the first column
    
        2
  •  2
  •   BENY    6 年前

    使用 mul 具有 axis = 0 index 价值依据 get_level_values

    df.mul(df.index.get_level_values(1),axis=0)
    Out[167]: 
           X   Y   Z
    A 10  10   0  10
    B 50   0   0   0
    C 80  80  80  80
    

    dfs = np.split(df, [2], axis=0)
    pd.concat([x.mul(x.index.get_level_values(1), axis=0) for x in dfs])
    Out[174]: 
           X   Y   Z
    A 10  10   0  10
    B 50   0   0   0
    C 80  80  80  80
    

    我也会推荐 numpy 广播

    df.values*df.index.get_level_values(1)[:,None]
    Out[177]: Int64Index([[10, 0, 10], [0, 0, 0], [80, 80, 80]], dtype='int64')
    pd.DataFrame(df.values*df.index.get_level_values(1)[:,None],index=df.index,columns=df.columns)
    Out[181]: 
           X   Y   Z
    A 10  10   0  10
    B 50   0   0   0
    C 80  80  80  80