一句话中的问题:我目前正在使用 pandas apply 函数来复制 Excel Vlookup,但是我觉得这不是最有效的方法,因为它需要很长时间来处理(对于具有 600k 行的数据集需要 10 分钟)和 10-15 列。
我有一个包含 Google Analytics 数据的数据集。我想为数据集中的每个唯一 URL 分配一个特定的营销活动 ID,目前正在使用匹配表 + 应用 lambda 函数来执行此操作:
A 栏 | B 栏 |
---|---|
df_ftr | 包含 Google Analytics 数据的数据集 |
df_match | 配套表 |
活动ID | 由我们的 CRM 系统生成且必须分配给给定页面的唯一密钥 |
页面路径 | 我在匹配表中用作查找值的 URL |
财产 | 该数据集包含来自 3 个不同网站的数据。这是一个附加条件,需要满足才能分配给定的营销活动 ID。 |
df_ftr['campaignId'] = df_ftr['pagePath'].progress_apply(lambda x: df_match['campaignId'][(df_match['pagePath'] == x) & (df_match['property'] == i)].values[0] if len(df_match.loc[df_match['pagePath'] == x].loc[df_match['property'] == i].values) > 0 else np.nan)
Google Analytics 数据集片段(示例):
日期 | 页面路径 | 活动ID | 财产 | 浏览量等 |
---|---|---|---|---|
06/03/23 | / | 0 | 34 | |
06/03/23 | /关于我们 | 0 | 12 | |
06/03/23 | /关于我们 | 1 | 32 |
匹配表片段(示例):
页面路径 | 财产 | 活动ID |
---|---|---|
/ | 0 | POE-3732-CNS |
/关于我们 | 0 | EHE-7648-FHD |
/关于我们 | 1 | OWS-2739-WJS |
解决这个问题最有效的方法是什么?
我已经尝试使用 pandarallel(多核处理)来加速该过程,虽然这减少了所需总时间的约 25%,但频繁运行仍然需要太多时间。
鉴于您的匹配表包含 pagePath 和属性组合的唯一条目,您可以执行以下操作:
pd.merge(df_google_analytics, df_matching, on=['pagePath', 'property'])
将您的解决方案与我的解决方案进行比较有点困难,因为您没有提供您应用的功能,但您可以检查
import pandas as pd
import numpy as np
import time
df_ftr = pd.DataFrame({
'Date': ['06/03/23', '06/03/23', '06/03/23'],
'pagePath': ['/', '/about-us', '/about-us'],
'property': [0, 0, 1],
'Pageviews': [34, 12, 32]
})
df_match = pd.DataFrame({
'pagePath': ['/', '/about-us', '/about-us'],
'property': [0, 0, 1],
'campaignId': ['POE-3732-CNS', 'EHE-7648-FHD', 'OWS-2739-WJS']
})
# Original solution using apply and lambda
start_time = time.time()
i = 0
df_ftr['campaignId'] = df_ftr['pagePath'].progress_apply(lambda x: df_match['campaignId'][(df_match['pagePath'] == x) & (df_match['property'] == i)].values[0] if len(df_match.loc[df_match['pagePath'] == x].loc[df_match['property'] == i].values) > 0 else np.nan)
print("Original solution execution time: %.4f seconds" % (time.time() - start_time))
# Solution using merge
start_time = time.time()
merged_df = pd.merge(df_ftr, df_match, on=['pagePath', 'property'], how='left')
merged_df = merged_df.drop_duplicates(subset='pagePath')
merged_df = merged_df[['pagePath', 'campaignId']]
df_ftr = pd.merge(df_ftr, merged_df, on='pagePath', how='left')
print("New solution execution time: %.4f seconds" % (time.time() - start_time))
我的解决方案返回
New solution execution time: 0.0174 seconds
如果我的效率较低,我会删除它。