【问题标题】:Merging 2 DataFrames based on DateTime feature基于 DateTime 功能合并 2 个 DataFrame
【发布时间】:2020-12-25 01:41:16
【问题描述】:

我有以下 2 个数据帧 question_postsnice_questionquestion_posts 为每个用户提供多个条目,而 nice_question 具有唯一的 UserId 值。

部分 question_posts

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 的新功能,它应该基于从 question_posts 数据帧获得的 average score = total score/total posts。对于用户在nice_question 中提供的date 之前发布的帖子,应计算average score

我尝试了以下代码,但出现错误。

代码

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

【问题讨论】:

  • 我不明白预期的结果。用户981只有一个问题,50分。为什么质量因素/平均分是5? (同样的问题也适用于其他用户)。
  • @Roy2012 这只是数据的一部分,数据框question_posts 具有同一用户的多个条目(上述问题中没有提到所有这些条目,这就是Quality Factor 的原因不匹配)。第二个数据框 nice_question 仅具有唯一的 UserId 值,因为我们进行所需的聚合以找到 Quality Factor 的值。
  • 在下面查看我的答案。希望这会有所帮助。

标签: python pandas dataframe datetime group-by


【解决方案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

【讨论】:

  • 这非常适合这个问题。但是,如果我想基于相同的逻辑从nice_question 中删除行而不合并数据帧,那么此代码行nice_question =nice_question[nice_question.CreationDate &lt; question_post.Date] 会产生错误ValueError: Can only compare identically-labeled Series objects。如何解决这个问题?
【解决方案2】:

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

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

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

要获得你想要的,你应该使用 joingroupby pandas 方法

例如,通过这种方式,我获得了一个新的 df,我可以在其中对每行进行比较

new_df = pd.merge(question_posts,
                  nice_question,
                  left_on='OwnerUserId',
                  right_on='UserId', how='outer')

【讨论】:

  • 但是如何放置日期时间条件来获得所需的输出呢?
  • @IshanDutta new_df = new_df[(new_df['CreationDate']&lt;new_df['date'])] 然后你可以使用聚合
猜你喜欢
  • 2018-02-05
  • 2017-07-01
  • 2019-11-29
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多