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