我有两个数据-一个包含交易/订单信息,另一个包含时,从一个活动的电子邮件发送出去。
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的解决方案,但速度不是特别快,而且对于更大的事务量来说可能是不可持续的。我想知道是否有更好的方法来做到这一点。
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,)))发布于 2019-09-11 15:04:15
首先将列转换为datetime (如果已经有datetime-忽略此步骤):
email_df.email_sent_date=pd.to_datetime(email_df.email_sent_date)
transaction_df.order_date=pd.to_datetime(transaction_df.order_date)对两个数据格式中的日期进行排序:
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合并
pd.merge_asof(a,b,by='Email',left_on='email_sent_date',
right_on='order_date',direction='nearest') 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,其内容如下:
公差:整数或时间增量,可选,默认不选择此范围内的容忍度;必须与合并索引兼容。
https://stackoverflow.com/questions/57891576
复制相似问题