如何解决基于DateTime功能合并2个DataFrame
我有以下两个数据帧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
解决方法
此代码行不起作用,因为在编写时,它是第一个数据帧的每一行与第二个数据帧的每一行之间的成对比较。
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')
,
这是一个解决方案(为清晰起见,只需几个步骤):
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。