如何从包含多值特质列的DataFrame中生成带权重的边列表
实现方案
以下是基于Pandas的完整实现逻辑,你的初始思路方向完全正确,具体步骤和代码如下:
- 第一步:展开特质列,将每个英雄的每个特质拆分为单独行
- 第二步:对展开后的表做自连接,匹配出所有共享同一特质的英雄对
- 第三步:过滤无效配对(自己和自己的配对),可选过滤双向重复配对
- 第四步:按英雄对分组统计出现次数,就是两个英雄共享的特质数量(即边权重)
完整代码
import pandas as pd # 构造示例数据,可替换为你的实际数据 df = pd.DataFrame({ 'Champion': ['Alphelios', 'Ashe', 'Heimerdinger', 'Lee Sin'], 'Traits': [ ['Nightbringer', 'Ranger'], ['Draconic', 'Ranger'], ['Renewer', 'Draconic', 'Caretaker'], ['Nightbringer', 'Skirmisher'] ] }) # 1. 展开Traits列 df_explode = df.explode('Traits', ignore_index=True) # 2. 自连接匹配同特质的英雄对 df_merge = df_explode.merge(df_explode, on='Traits', suffixes=('_source', '_target')) # 3. 过滤无效配对:移除自己和自己的配对,同时用大小于判断避免A-B和B-A的重复双向边 # 如果需要保留双向边,仅保留`Champion_source != Champion_target`的判断即可 df_merge = df_merge[df_merge['Champion_source'] < df_merge['Champion_target']] # 4. 分组统计权重,得到最终边列表 edge_df = df_merge.groupby(['Champion_source', 'Champion_target'], as_index=False)['Traits'].count() edge_df.rename(columns={'Traits': 'weight'}, inplace=True)
输出示例
最终得到的edge_df结构如下:
| Champion_source | Champion_target | weight |
|---|---|---|
| Alphelios | Ashe | 1 |
| Alphelios | Lee Sin | 1 |
| Ashe | Heimerdinger | 1 |
注:该方案在英雄量级小于1000的场景下性能足够,完全满足普通游戏数据分析需求
内容的提问来源于stack exchange,提问作者annsofs
相关产品推荐
相关产品推荐

