乘以许多列熊猫

时间:2018-06-27 14:18:22

标签: python pandas multiple-columns

我有一个这样的数据帧,但是有更多列,我想将每两个相邻列相乘,并在旁边的新列中声明这两个的乘积,并将其称为Sub_pro并在end在称为Sub_pro的列中具有所有F_Pro的总和,并将精度降低到3个小数位。我不知道如何获取Sub_pro列。下面是我的代码。

import pandas as pd
df = pd.read_excel("C:dummy")
df['F_Pro'] = ("Result" * "Attribute").sum(axis=1)
df.round(decimals=3)
print (df)

输入

Id Result   Attribute       Result1    Attribute1
 1 0.5621     0.56            536        0.005642
 2 0.5221     0.5677          2.15          93
 3 0.024564   5.23            6.489         8
 4 11.564256  4.005           0.45556       5.25
 5 0.6123     0.4798          0.6667        5.10

期望输出

id  Result  Attribute   Sub_Pro     Result1     Attribute1   Sub_pro1       F_Pro
1   0.5621    0.56      0.314776        536     0.005642    3.024112    3.338888
2   0.5221    0.5677    0.29639617      2.15    93          199.95      200.2463962
3   0.024564  5.23      0.12846972      6.489   8           51.912      52.04046972
4   11.564256 4.005     46.31484528     0.45556 5.25        2.39169     48.70653528
5   0.6123    0.4798    0.29378154      0.6667  5.1         3.40017     3.69395154

3 个答案:

答案 0 :(得分:1)

if(i==59){
    //snip
    i=0
}

它解决了问题,但是您现在需要订购de列,您可以遍历键,而不是对整个行进行深拷贝。希望该代码对您有所帮助。

答案 1 :(得分:1)

由于您有多个名称相同的列,因此这是使用filter的一种方法。要查看其工作原理,请在您的df上执行df.filter(like='Result'),然后获得名称中包含Result的列:

      Result    Result1
0   0.562100  536.00000
1   0.522100    2.15000
2   0.024564    6.48900
3  11.564256    0.45556
4   0.612300    0.66670

您可以创建一个包含“ Sub_Pro”列的数组:

import numpy as np
arr_sub_pro = np.round(df.filter(like='Result').values* df.filter(like='Attribute').values,3)

,您将获得sub_pro列的值,例如arr_sub_pro

array([[3.1500e-01, 3.0240e+00],
       [2.9600e-01, 1.9995e+02],
       [1.2800e-01, 5.1912e+01],
       [4.6315e+01, 2.3920e+00],
       [2.9400e-01, 3.4000e+00]])

现在您需要将它们添加到数据框中的正确位置,我认为必须使用循环for

for nb, col in zip( range(arr_sub_pro.shape[1]), df.filter(like='Attribute').columns):
    df.insert(df.columns.get_loc(col)+1, 'Sub_pro{}'.format(nb), arr_sub_pro[:,nb])

在这里我获得Attibut(nb)列的位置,并将arr_sub_pro的nb列中的值插入下一个位置

要添加“ F_Pro”列,您可以执行以下操作:

df.insert(len(df.columns), 'F_Pro', arr_sub_pro.sum(axis=1))

最后的df如下:

   Id     Result  Attribute  Sub_pro0    Result1  Attribute1  Sub_pro1  \
0   1   0.562100     0.5600     0.315  536.00000    0.005642     3.024   
1   2   0.522100     0.5677     0.296    2.15000   93.000000   199.950   
2   3   0.024564     5.2300     0.128    6.48900    8.000000    51.912   
3   4  11.564256     4.0050    46.315    0.45556    5.250000     2.392   
4   5   0.612300     0.4798     0.294    0.66670    5.100000     3.400   

     F_Pro  
0    3.339  
1  200.246  
2   52.040  
3   48.707  
4    3.694  

答案 2 :(得分:0)

这是使用NumPy和字典理解的一种方法:

# extract NumPy array for relevant columns
A = df.iloc[:, 1:].values
n = int(A.shape[1] / 2)

# calculate products and feed to pd.DataFrame
prods = pd.DataFrame({'Sub_Pro_'+str(i): np.prod(A[:, 2*i: 2*(i+1)], axis=1) \
                      for i in range(n)})

# calculate sum of product rows
prods['F_Pro'] = prods.sum(axis=1)

# join to original dataframe
df = df.join(prods)

print(df)

   Id     Result  Attribute    Result1  Attribute1  Sub_Pro_0   Sub_Pro_1  \
0   1   0.562100     0.5600  536.00000    0.005642   0.314776    3.024112   
1   2   0.522100     0.5677    2.15000   93.000000   0.296396  199.950000   
2   3   0.024564     5.2300    6.48900    8.000000   0.128470   51.912000   
3   4  11.564256     4.0050    0.45556    5.250000  46.314845    2.391690   
4   5   0.612300     0.4798    0.66670    5.100000   0.293782    3.400170   

        F_Pro  
0    3.338888  
1  200.246396  
2   52.040470  
3   48.706535  
4    3.693952