如何从透视表(Pivot Table)生成用户距离DataFrame?
生成用户间距离矩阵的实现方案
问题说明
已将用户-物品关联表转换为布尔型透视表,可计算单个用户对的曼哈顿距离(绝对值之和),需要生成包含所有用户对距离的完整矩阵。
初始关联表
| 用户 | 拥有物品 |
|---|---|
| Alice | Apple |
| Bob | Banana |
| Carol | Carrot |
| Bob | Apple |
转换后的布尔透视表
| Apple | Banana | Carrot | |
|---|---|---|---|
| Alice | 1 | 0 | 0 |
| Bob | 1 | 1 | 0 |
| Carol | 0 | 0 | 1 |
目标距离矩阵(曼哈顿距离)
| Alice | Bob | Carol | |
|---|---|---|---|
| Alice | 0 | 1 | 2 |
| Bob | 1 | 0 | 3 |
| Carol | 2 | 3 | 0 |
实现方法
方法1:使用scipy快速计算(推荐)
借助scipy.spatial.distance_matrix直接生成距离矩阵,指定cityblock(曼哈顿距离)匹配需求:
import pandas as pd from scipy.spatial import distance_matrix # 1. 生成透视表(复用现有代码) df = pd.DataFrame({ "person": ["Alice", "Bob", "Carol", "Bob"], "hasa": ["Apple", "Banana", "Carrot", "Apple"] }) df["val"] = 1 pivot = df.pivot(index="person", columns="hasa", values="val").fillna(0) # 2. 计算并转换为DataFrame dist_matrix = pd.DataFrame( distance_matrix(pivot.values, pivot.values, metric='cityblock'), index=pivot.index, columns=pivot.index ) # 输出结果 print(dist_matrix)
优点:效率极高,适合大规模数据集;代码简洁。
方法2:纯Pandas实现
利用Pandas的apply和广播机制完成计算,无需额外依赖:
import pandas as pd # 生成透视表步骤同上 df = pd.DataFrame({ "person": ["Alice", "Bob", "Carol", "Bob"], "hasa": ["Apple", "Banana", "Carrot", "Apple"] }) df["val"] = 1 pivot = df.pivot(index="person", columns="hasa", values="val").fillna(0) # 计算距离矩阵 dist_matrix = pivot.apply(lambda user_row: (pivot - user_row).abs().sum(axis=1)) print(dist_matrix)
优点:仅依赖Pandas,逻辑直观;中等规模数据表现良好。
方法3:手动循环实现(仅小数据集测试用)
通过双重循环逐个计算用户对距离,效率较低,仅适合调试或极小数据集:
import pandas as pd # 生成透视表步骤同上 df = pd.DataFrame({ "person": ["Alice", "Bob", "Carol", "Bob"], "hasa": ["Apple", "Banana", "Carrot", "Apple"] }) df["val"] = 1 pivot = df.pivot(index="person", columns="hasa", values="val").fillna(0) # 初始化空矩阵 users = pivot.index.tolist() dist_matrix = pd.DataFrame(0, index=users, columns=users) # 双重循环计算每个用户对的距离 for user_a in users: for user_b in users: dist_matrix.loc[user_a, user_b] = (pivot.loc[user_a] - pivot.loc[user_b]).abs().sum() print(dist_matrix)
优点:逻辑完全透明;缺点:时间复杂度O(n²),大数据集下性能极差。
内容的提问来源于stack exchange,提问作者Sasha Sloan
相关产品推荐
相关产品推荐

