2つのデータフレームがあります。1つはトランザクション/注文情報を含み、もう1つはキャンペーンからの電子メールがいつ送信されるかを含みます。
import pandas as pd
email_data = {'Email' : ['[email protected]', '[email protected]', '[email protected]', '[email protected]'],
'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' : ['[email protected]', '[email protected]', '[email protected]', '[email protected]'],
'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,)))
最初に列を日時に変換します(すでに日時の場合-この手順は無視してください)。
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
すると、最初Email
にby=
paramを使用してマージし、次に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 [email protected] 2019-08-01 2019-09-05
1 [email protected] 2019-08-05 2019-09-05
2 [email protected] 2019-09-05 2019-09-05
3 [email protected] 2019-09-09 2019-09-10
使用したパラメータ:
by:列名または列名のリストマージ操作を実行する前に、これらの列を照合します。
left_by:列名左側のDataFrameで一致するフィールド名。
right_by:列名右側のDataFrameで一致するフィールド名。
方向:「後方」(デフォルト)、「前方」、または「最も近い」前、後、または最も近い一致を検索するかどうか。
また、次のようにtolerance
読み取るparamを確認することもできます。
許容値:整数またはTimedelta、オプション、デフォルトなしこの範囲内の許容値を選択します。マージインデックスと互換性がある必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加