我有以下两个数据帧question_posts
和nice_question
。 question_posts
每个用户都有多个条目,而nice_question
具有唯一的UserId
值。
一部分问题
OwnerUserId | CreationDate | Score
981 |2009-09-28 16:11:38.533 | 50
483 | 2009-10-18 15:11:20.533 | 700
698 | 2010-09-28 16:11:35.533 | 0
10 | 2009-01-28 10:12:38.7 | 200
nice_question的一部分
UserId | Date
981 | 2009-10-17 17:38:32.59
10 | 2009-10-20 08:37:14.143
290 | 2009-10-20 18:07:51.247
699 | 2009-10-20 21:25:24.483
我想在nice_question
数据框中创建一个称为Quality Factor
的新功能,该功能应基于从average score = total score/total posts
数据框中获得的question_posts
。对于用户在average score
中提供的date
之前发布的帖子,应计算nice_question
。
我尝试了以下代码,但出现错误。
代码
nice_question['Quality Factor'] = (question_posts.loc[question_posts['CreationDate']<nice_question['date']]).sum()
错误
Can only compare identically-labeled Series objects
预期产量
>>nice_question.head(4)
>> UserId | Date | Quality Factor
981 | 2009-10-17 17:38:32.59 | 5
10 | 2009-10-20 08:37:14.143 | 16
290 | 2009-10-20 18:07:51.247 | 66
699 | 2009-10-20 21:25:24.483 | 9
答案 0 :(得分:1)
此代码行不起作用,因为在编写时,它是第一个数据帧的每一行与第二个数据帧的每一行之间的成对比较。
nice_question['Quality Factor'] = (question_posts.loc[question_posts['CreationDate']<nice_question['date']]).sum()
如果两个数据框具有相同的大小(行数),则将起作用。但这不是你想要的
要获得所需的内容,您应该使用join和groupby熊猫方法
例如,通过这种方式,我获得了一个新的df,可以在其中对每一行进行比较
new_df = pd.merge(question_posts,
nice_question,
left_on='OwnerUserId',
right_on='UserId', how='outer')
答案 1 :(得分:1)
这是一个解决方案(为清晰起见,只需几个步骤):
t = pd.merge(nice_question, question_post, left_on = "UserId", right_on= "OwnerUserId", how = "left")
t = t[t.CreationDate < t.Date]
avg_scores = t.groupby("UserId")[["Score"]].mean()
avg_scores = avg_scores.rename(columns = {"Score": "avg_score"})
res = pd.merge(nice_question, avg_scores, left_on="UserId", right_index=True)
对于样本数据,结果为:
UserId Date avg_score
0 981 2009-10-17 17:38:32.59 50.0
1 10 2009-10-20 08:37:14.143 200.0