【发布时间】:2020-09-24 05:36:50
【问题描述】:
我有一个 pandas 数据框 df,如下所示:
student_id category_id count
1 111 10
2 111 5
3 222 8
4 333 5
5 111 6
同样,我有 2000 万行。
我想计算每个 student_id 的评分。例如,让我们考虑一个 category_id “111”。我们在这个类别中有 3 个学生 ID 1、2 和 5。 student_id 1 有 10 个计数, student_id 2 有 5 个计数, student_id 5 有 6 个计数。 每个 student_id 对 category_id 的评分由以下公式计算:
(count per student_id / total number of counts per category_id) * 5
对于 student_id 1 -> 10/ 21 * 5 = 2.38
对于 student_id 2 -> 5/ 21 *5 = 1.19
对于 student_id 5 -> 6/ 21 * 5 = 1.43
下面是我必须计算的函数:
countPerStudentID = datasetPandas.groupby('student_id').agg(list)
countPerCategoryID = datasetPandas.groupby('category_id').agg(list)
studentIDMap = dict()
def func1(student_id):
if student_id in studentIDMap:
return studentIDMap[student_id]
runningSum = 0
countList = countPerStudentID.loc[student_id, 'count']
for count in countList:
runningSum += count
studentIDMap[student_id] = runningSum
return studentIDMap[student_id]
#Similar to the above function
categoryIDMap = dict()
def func2(category_id):
if category_id in categoryIDMap:
return categoryIDMap[category_id]
runningSum = 0
countList = countPerCategoryID.loc[category_id, 'count']
for count in countList:
runningSum += count
categoryIDMap[category_id] = runningSum
return categoryIDMap[category_id]
最后我从下面调用这两个函数:
#Calculating rating category-wise
rating = []
for index, row in df.iterrows():
totalCountPerCategoryID = func1(row['category_id'])
totalCountPerStudentID = func2(row['student_id'])
rating.append((totalCountPerStudentID / totalCountPerCategoryID) * 5)
df['rating'] = rating
需要的输出:
student_id category_id count rating
1 111 10 2.38
2 111 5 1.19
3 222 8 5
4 333 5 5
5 111 6 1.43
由于数据量很大,运行它需要大量时间。我想知道如何优化这个计算
提前致谢
【问题讨论】:
标签: python pandas dataframe optimization bigdata