在Pandas DataFrame中计算多个综合得分

时间:2018-03-12 14:31:19

标签: python pandas

我是这里的Python和Pandas新手以及首次Stackoverflow问题。

我正在处理一些调查数据,需要创建多个综合得分。我的问题是有50个满意度分数和50个重要性分数,因此我需要使用简单的计算来计算50个综合分数:Comp1 = Sat1 * Imp1。

这是一个类似的示例DataFrame(为简单起见缩小到仅仅5个指标)到我正在使用的那个...

import numpy as np
import pandas as pd
arr = np.random.randint(1,6, size=(6,10))
data = pd.DataFrame(arr, columns=['Sat1', 'Sat2', 'Sat3', 'Sat4', 'Sat5', 'Imp1', 'Imp2', 'Imp3', 'Imp4', 'Imp5'])
print(data)

然后我为我的新复合变量添加了新的列/系列到我的DF ......

comp = []
string = "Comp"
comp = [string+str(i) for i in range(1,6)]
data = pd.concat([data, pd.DataFrame(columns=list(comp))], axis=1)
print(data)

我知道如何一次计算一个复合指标(系列):

data['Comp1'] = data['Sat1'] * data['Imp1']
print(data)

但我正在努力弄清楚如何在数据框中的50个指标中迭代这个计算。

有人可以帮忙吗?

更新:

预期产出:

  Sat1 Sat2Sat3Sat4Sat5Imp1Imp2Imp3Imp4Imp5Comp1Comp2Comp3Comp4Comp5
0   1   5   2   2   1   4   1   2   4   4   4   5   4   8   4
1   2   1   2   1   3   2   5   2   5   2   4   5   4   5   6
2   1   3   1   5   3   1   4   3   3   4   1   12  3   15  12
3   4   3   5   3   1   5   1   1   4   3   20  3   5   12  3
4   4   2   4   5   3   2   3   2   5   5   8   6   8   25  15
5   1   4   2   1   2   5   4   4   1   3   5   16  8   1   6

3 个答案:

答案 0 :(得分:3)

IIUC,我想你这样做了:

data.join(data.groupby(data.columns.str.extract(r'(\d+\b)',expand=False), axis=1)
     .prod()
     .add_prefix('Comp'))

OR

(data.assign(**data.groupby(data.columns.str.extract(r'(\d+\b)',expand=False), axis=1)
     .prod()
     .add_prefix('Comp')))

输出:

   Sat1  Sat2  Sat3  Sat4  Sat5  Imp1  Imp2  Imp3  Imp4  Imp5  Comp1  Comp2  Comp3  Comp4  Comp5
0     3     5     3     2     4     3     4     2     2     1      9     20      6      4      4
1     2     2     1     1     2     4     5     1     1     5      8     10      1      1     10
2     2     4     3     5     3     5     1     1     2     4     10      4      3     10     12
3     5     5     5     2     4     3     2     5     1     4     15     10     25      2     16
4     3     1     4     3     3     3     3     5     4     4      9      3     20     12     12
5     5     5     4     3     1     5     4     2     4     3     25     20      8     12      3

第一步:

data.groupby(data.columns.str.extract(r'(\d+\b)',expand=False), axis=1)\
    .prod()\
    .add_prefix('Comp')

输出:

   Comp1  Comp2  Comp3  Comp4  Comp5
0      9     20      6      4      4
1      8     10      1      1     10
2     10      4      3     10     12
3     15     10     25      2     16
4      9      3     20     12     12
5     25     20      8     12      3

答案 1 :(得分:0)

由于您的列是有序的,您可以通过提取的numpy数组执行计算而不进行排序:

import numpy as np
import pandas as pd
arr = np.random.randint(1,6, size=(6,10))
df = pd.DataFrame(arr, columns=['Sat1', 'Sat2', 'Sat3', 'Sat4', 'Sat5', 'Imp1', 'Imp2', 'Imp3', 'Imp4', 'Imp5'])

cols = df.columns

sat = df[cols[cols.str.startswith('Sat')]].values
imp = df[cols[cols.str.startswith('Imp')]].values
comp = sat * imp

df = df.join(pd.DataFrame(comp, columns=['Comp'+str(i) for i in range(1, comp.shape[1]+1)]))

#    Sat1  Sat2  Sat3  Sat4  Sat5  Imp1  Imp2  Imp3  Imp4  Imp5  Comp1  Comp2  \
# 0     1     4     1     3     4     3     1     3     5     1      3      4   
# 1     1     2     5     4     4     2     4     1     4     2      2      8   
# 2     3     4     5     1     3     5     4     1     4     1     15     16   
# 3     1     1     2     1     4     5     1     1     3     5      5      1   
# 4     2     4     5     4     1     3     4     2     4     1      6     16   
# 5     3     2     1     5     3     3     2     4     4     4      9      4   

#    Comp3  Comp4  Comp5  
# 0      3     15      4  
# 1      5     16      8  
# 2      5      4      3  
# 3      2      3     20  
# 4     10     16      1  
# 5      4     20     12  

答案 2 :(得分:0)

你可以这样做:

import numpy as np
import pandas as pd
arr = np.random.randint(1,6, size=(6,10))
data = pd.DataFrame(arr, columns=['Sat1', 'Sat2', 'Sat3', 'Sat4', 'Sat5', 'Imp1', 'Imp2', 'Imp3', 'Imp4', 'Imp5'])

for i in range(1,6):
    data['Comp'+str(i)] = data['Sat'+str(i)].multiply(data['Imp'+str(i)])

print(data)