Python 将许多列相乘

Python 将许多列相乘,python,pandas,multiple-columns,Python,Pandas,Multiple Columns,我有一个这样的数据框,但是由于有更多的列,我想将每两个相邻的列相乘,并在旁边的一个新列中说明这两个列的乘积,称之为Sub_pro,最后在一个名为F_pro的列中列出所有Sub_pro的总和,并将精度降低到小数点后3位。我不知道如何获得Sub_pro列。下面是我的代码 import pandas as pd df = pd.read_excel("C:dummy") df['F_Pro'] = ("Result" * "Attribute").sum(axis=1) df.round(decima

我有一个这样的数据框,但是由于有更多的列,我想将每两个相邻的列相乘,并在旁边的一个新列中说明这两个列的乘积,称之为
Sub_pro
,最后在一个名为
F_pro
的列中列出所有
Sub_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   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
将熊猫作为pd导入
src=“/opt/repos/pareto/test/stack/data.csv”
df=pd.read\U csv(src)
计数=0
def倍增(x):
res=x.copy()
键长=长(x)
idx=1
而idx+1

它解决了这个问题,但是您现在需要对de列进行排序,这样您就可以迭代键,而不是对整行进行深度复制。我希望代码能帮助你

因为有几个列的名称相同,这里有一种使用
过滤器的方法。要查看它是如何工作的,请在
df
上执行
df.filter(如class='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 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\u sub\u 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  

这里有一种使用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  

您的所有列都是以“Result”和“Attribute”命名的,后面是数字,还是仅在您的示例中?在这些列之前,我还有其他列,但我要乘的列被称为升序列。e、 g.结果1,2,3,4等。如何使子列从索引1开始而不是从0开始?@JoseVasquez替换
'sub\u pro{}.format(nb)
by
'sub\u pro{}.format(nb+1)
df中插入
循环
for
   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  
# 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