在 (1m x 10) pandas 数据集上运行匹配表 (500 x 3) 的最有效方法

问题描述 投票:0回答:2

一句话中的问题:我目前正在使用 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%,但频繁运行仍然需要太多时间。

python pandas lambda google-analytics apply
2个回答
1
投票

鉴于您的匹配表包含 pagePath 和属性组合的唯一条目,您可以执行以下操作:

pd.merge(df_google_analytics, df_matching, on=['pagePath', 'property'])


0
投票

将您的解决方案与我的解决方案进行比较有点困难,因为您没有提供您应用的功能,但您可以检查

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

如果我的效率较低,我会删除它。

© www.soinside.com 2019 - 2024. All rights reserved.