You need to enable JavaScript to run this app. 如何快速计算pandas DataFrame不同网站子集的访客ID重叠量
优惠活动
大模型
产品
解决方案
定价
更多

如何快速计算pandas DataFrame不同网站子集的访客ID重叠量

优化实现方案

你原有方案的核心问题是每次计算一组组合都要重新遍历全表筛选、做 merge,1600组组合就要重复1600次全表扫描和大数据量合并,耗时必然很高。下面提供两种高效实现思路:

方案1:稀疏矩阵一次性计算全量组合(最优)

只需要扫描1次全表,通过矩阵运算一次性得到所有两两组合的重叠数,效率最高,适合组合量大的场景:

import pandas as pd
import scipy.sparse as sp

# 第一步:先去重,剔除同一用户访问同一网站的重复记录,大幅降低数据量
df_unique = df.drop_duplicates(["project_name", "ID"]).reset_index(drop=True)

# 第二步:将字符串类型的ID、网站名转成整数编码,降低内存占用、提升运算效率
df_unique["user_code"] = df_unique["ID"].astype("category").cat.codes
df_unique["site_code"] = df_unique["project_name"].astype("category").cat.codes

# 第三步:构建稀疏用户-网站访问矩阵(行对应用户,列对应网站,值为1表示该用户访问过对应网站)
user_count = df_unique["user_code"].nunique()
site_count = df_unique["site_code"].nunique()
access_mat = sp.csr_matrix(
    ([1] * len(df_unique), (df_unique["user_code"], df_unique["site_code"])),
    shape=(user_count, site_count)
)

# 第四步:矩阵转置后相乘,直接得到所有两两网站的共同访客数,结果[i][j]就是第i个和第j个网站的重叠用户数
overlap_mat = access_mat.T.dot(access_mat)

# 第五步:把结果映射回网站名,直接查询即可
site_names = df_unique["project_name"].astype("category").cat.categories.tolist()
overlap_df = pd.DataFrame(overlap_mat.todense(), index=site_names, columns=site_names)

# 示例:查询Website A和Website B的重叠用户数
both = overlap_df.loc["Website A", "Website B"]
# 单个网站总访客数直接取对角值即可
one_total = overlap_df.loc["Website A", "Website A"]
two_total = overlap_df.loc["Website B", "Website B"]
# 计算重叠比例
both_pc = round(both / (one_total + two_total - both), 4)

方案2:预存用户集合,按需计算(实现最简单)

如果组合计算不需要一次性出全量结果,只想按需查询指定组合,用这个方案实现最简便:

# 一次性分组,把每个网站的用户ID存为集合,后续查询直接用集合交集计算
site_user_map = df.drop_duplicates(["project_name", "ID"]).groupby("project_name")["ID"].agg(set).to_dict()

# 示例:计算Website A和Website B的重叠数
both = len(site_user_map["Website A"] & site_user_map["Website B"])
one_total = len(site_user_map["Website A"])
two_total = len(site_user_map["Website B"])
both_pc = round(both / (one_total + two_total - both), 4)

优化注意事项

  • 优先做数据去重:同一用户访问同一网站的重复记录对统计无意义,提前去重可以降低30%~70%的数据量
  • 字符串ID优先转整数编码:不管是集合运算还是矩阵运算,整数的运算效率和内存占用都远优于字符串
  • 所有统计的前置计算(分组、矩阵构建)都只需要做一次,不需要每次计算组合都重复执行

内容的提问来源于stack exchange,提问作者travelsandbooks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:06:03