我是这里的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
答案 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)