基于DateTime功能合并2个DataFrame

时间:2020-09-06 12:02:03

标签: python pandas dataframe datetime group-by

我有以下两个数据帧question_postsnice_questionquestion_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

2 个答案:

答案 0 :(得分:1)

此代码行不起作用,因为在编写时,它是第一个数据帧的每一行与第二个数据帧的每一行之间的成对比较。

nice_question['Quality Factor'] = (question_posts.loc[question_posts['CreationDate']<nice_question['date']]).sum() 

如果两个数据框具有相同的大小(行数),则将起作用。但这不是你想要的

要获得所需的内容,您应该使用joingroupby熊猫方法

例如,通过这种方式,我获得了一个新的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
相关问题