【问题标题】:Faster way to associate two pandas DataFrames?关联两个熊猫数据框的更快方法?
【发布时间】:2017-12-01 22:15:59
【问题描述】:

我有两个熊猫数据框:

自动化

index   id  user_id merchant_id marketing_email_id  start_date  end_date    email_status    created_at
0   133198  133199  10939   88  681 2016-06-29  2016-07-06  1   2016-06-29 11:26:46
1   578787  578788  226281  745 1636    2017-09-14  2017-09-21  0   2017-09-14 12:32:32
2   222373  222374  86557   37  1274    2016-12-31  2017-01-07  0   2016-12-31 13:31:18
3   279039  279040  92109   669 1470    2017-03-01  2017-03-15  0   2017-03-01 12:09:27
4   33913   33914   25422   155 652 2016-02-22  2016-02-27  1   2016-02-22 12:45:15
5   423084  423085  29820   509 2067    2017-06-19  2017-06-20  1   2017-06-19 10:00:43
6   592752  592753  368756  1310    2827    2017-09-21  2017-09-28  0   2017-09-21 06:03:49
7   660899  660900  13007   206 2189    2017-10-19  2017-10-26  0   2017-10-19 07:47:48
8   491336  491337  125266  745 1626    2017-07-26  2017-08-02  0   2017-07-26 11:31:28
9   424653  424654  115139  687 1832    2017-06-20  2017-06-27  0   2017-06-20 07:33:03

访问

    user_id merchant_id visit_verified
created_at          
2015-02-09 10:57:05 57  29  1
2015-02-09 14:23:12 58  30  1
2015-02-09 14:29:14 58  30  1
2015-02-09 14:51:26 59  30  1
2015-02-09 16:14:50 60  29  1
2015-02-09 16:17:22 61  30  1
2015-02-09 17:44:20 62  30  1
2015-02-09 17:46:57 63  30  1
2015-02-09 17:53:26 60  29  1
2015-02-09 18:03:40 64  29  1

我正在尝试关联自动表中的每一行,如果访问表中有相应的行,其中 created_at 在 start_date 和 end_date 之间。

以下是用于计算它的代码:

automate.iloc[1,"visit"] = visits[visits.user_id.isin([automate.iloc[1].user_id])][automate.iloc[1].start_date:automate.iloc[1].end_date].index.values

在为自动表中的所有 700k 行 复制上述内容时会出现问题。 遍历自动表中的每一行似乎非常慢。我使用了 df.iterrows 函数,但无法为每一行赋值。

是否有更快的方法可以用于上述逻辑?

编辑 1: 预期的输出应该是

index   id  user_id merchant_id marketing_email_id  start_date  end_date    email_status    created_at  Visit
0   133198  133199  10939   88  681 2016-06-29  2016-07-06  1   2016-06-29 11:26:46 NaN
1   578787  578788  226281  745 1636    2017-09-14  2017-09-21  0   2017-09-14 12:32:32 NaN
2   222373  222374  86557   37  1274    2016-12-31  2017-01-07  0   2016-12-31 13:31:18 NaN
3   279039  279040  92109   669 1470    2017-03-01  2017-03-15  0   2017-03-01 12:09:27 NaN
4   33913   33914   25422   155 652 2016-02-22  2016-02-27  1   2016-02-22 12:45:15 NaN

如果给定的用户在开始-结束日期内访问,这里的 NaN 值可能会或可能不会填充时间戳值。

【问题讨论】:

  • 你能提供预期的输出吗?
  • 添加了预期的输出。请看

标签: python pandas numpy


【解决方案1】:

嗯,是的,这很难。我唯一的建议可能是按日期/时间对两个数据帧进行排序,然后......这里有一些伪代码:

dfautomate2 = dfautomate.sortby(start_date)
dfvisit = dfvisit.sortby(created_at)
listofawesome = []
for visit in dfvisit:
    for event_range in dfautomate2:
        if event_range.start_date < visit.created_at < event_range.end_date:
            print("WINNING")
            listofawesome.append(event_range)
        else:
            dfautomate[event_range].delete #its been a while since I used pandas, but you get the idea

绝对不是最漂亮的,可能有更快/更好的方法来做到这一点。

这个想法是,如果两个数据帧都按最新到最旧排序,并且您遍历访问,如果您总是在最早的访问中,您可以删除自动化 df 中在它之前的行......这样在下一个 for 循环中,您不必在上次访问之前检查它们,因为它们已经通过了。

可能不适用于您的情况,但如果您想出解决方案,请告诉我,这是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 2018-03-07
    • 2013-10-23
    • 2021-06-06
    • 2021-08-31
    • 2021-06-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多