首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据另一个数据文件中的日期条件创建新列

根据另一个数据文件中的日期条件创建新列
EN

Stack Overflow用户
提问于 2019-09-11 14:38:48
回答 1查看 268关注 0票数 2

我有两个数据-一个包含交易/订单信息,另一个包含时,从一个活动的电子邮件发送出去。

代码语言:javascript
复制
import pandas as pd
email_data = {'Email' : ['test@gmail.com', 'test@gmail.com', 'test2@gmail.com', 'test2@gmail.com'],
                     'email_sent_date' : ['2019-08-05', '2019-08-01', '2019-09-09', '2019-09-05'],
                     'CampaignName' : ['Campaign1', 'Campaign2', 'Campaign2', 'Campaign1']}

email_df = pd.DataFrame(email_data)

transaction_data = {'Email' : ['test@gmail.com', 'test@gmail.com', 'test2@gmail.com', 'test2@gmail.com'],
         'order_date' : ['2019-09-05', '2019-09-10', '2019-09-05', '2019-09-10']}

transaction_df = pd.DataFrame(transaction_data)

我试图回答这个问题--对于给定的交易,在该交易之前发送的最新电子邮件是什么?

我有一个使用pd.apply的解决方案,但速度不是特别快,而且对于更大的事务量来说可能是不可持续的。我想知道是否有更好的方法来做到这一点。

代码语言:javascript
复制
email_df.sort_values(by='email_sent_date', inplace=True)

def find_recent_email(x,df):
    #df should be the email_df, sorted by customer_email and date, in ascending order
    #so the most recent email is last
    return df[df['Email'] == x]['email_sent_date'].tail(1).values[0]

transaction_df['recent_email_date'] = pd.to_datetime(transaction_df['Email'].apply(find_recent_email, args=(email_df,)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-11 15:04:15

首先将列转换为datetime (如果已经有datetime-忽略此步骤):

代码语言:javascript
复制
email_df.email_sent_date=pd.to_datetime(email_df.email_sent_date)
transaction_df.order_date=pd.to_datetime(transaction_df.order_date)

对两个数据格式中的日期进行排序:

代码语言:javascript
复制
a=email_df.sort_values('email_sent_date').drop('CampaignName',1)
b=transaction_df.sort_values('order_date')

使用merge_asof,我们可以首先使用by= param在Email上合并,然后使用direction='nearest'执行asof合并

代码语言:javascript
复制
pd.merge_asof(a,b,by='Email',left_on='email_sent_date',
                   right_on='order_date',direction='nearest')
代码语言:javascript
复制
             Email email_sent_date order_date
0   test@gmail.com      2019-08-01 2019-09-05
1   test@gmail.com      2019-08-05 2019-09-05
2  test2@gmail.com      2019-09-05 2019-09-05
3  test2@gmail.com      2019-09-09 2019-09-10

使用的Params:

by :在执行合并操作之前,列名或列名列表在这些列上匹配。 left_by :要在左DataFrame中匹配的列名字段名。 right_by :要在右DataFrame中匹配的列名字段名。 方向:“向后”(默认)、“向前”或“最近”是否搜索先前的、后续的或最近的匹配。

您还可以查看tolerance param,其内容如下:

公差:整数或时间增量,可选,默认不选择此范围内的容忍度;必须与合并索引兼容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57891576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档