【问题标题】:Creating Edgelist from DataFrame with column containing multiple values使用包含多个值的列从 DataFrame 创建 Edgelist
【发布时间】:2021-10-29 11:59:48
【问题描述】:

我有一个包含一些英雄及其相关特征的数据框,它看起来像这样:

Index Champion Traits
0 Alphelios 'Nightbringer', 'Ranger'
1 Ashe 'Draconic', 'Ranger'
2 Heimerdinger 'Renewer', 'Draconic', 'Caretaker'
3 Lee Sin 'Nightbringer', 'Skirmisher'

特征表示为:['Nightbringer', 'Ranger'], ['Draconic', 'Ranger'] 等。

...等等。

我希望创建一个包含冠军和具有相同特征的冠军的边缘列表;

Source Target
0 3
0 1
1 2

.. 名单还在继续。我还希望最后一个 DataFrame 包含一个带有权重的列,例如,如果两个冠军具有相同的两个特征,甚至是树,那么它的权重为 2 (3)。我认为应该扩展数据框,以便每个冠军都有几行(包含他们的每个特征),但我似乎无法找到解决问题的方法。有人可以帮我吗?谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

IIUC,你需要统计其他匹配特征的行数。

使用 str.get_dummies 和 numpy 的组合:

注意。这假设 Traits 是字符串,如果列表只是从列表中获取虚拟对象

import numpy as np

a = df.Traits.str.get_dummies(sep=',').values
b = a.dot(a.T)
np.fill_diagonal(b, 0)

pd.DataFrame({'Source': df['Index'],
              'Target': b.sum(1)})

输出:

   Source  Target
0       0       2
1       1       1
2       2       0
3       3       1

【讨论】:

  • 感谢您的建议,但仍然不是我想要的。最后三列“Renewer”、“Caretaker”和“Skirmisher”不应包含在边缘列表中。我在想它应该做类似'对于每个特征 - 如果等于另一个特征 - (附加?)索引',以便我得到每个关系的列表(例如 0,1)
【解决方案2】:

您可以使用所有特征出现的索引创建一个字典:

my_dict = {}

for i, j in enumerate(df['Traits']):
    for trait in j:
        if trait in my_dict:
            my_dict[trait].append(i)
        else:
            my_dict[trait] = [i]
print(my_dict)

输出:

{'Nightbringer': [0, 3], 'Ranger': [0, 1], 'Draconic': [1, 2], 'Renewer': [2], 'Caretaker': [2], 'Skirmisher': [3]}

这是一种更好的方法,因为您不会得到不必要的重复,例如0 points to 33 points to 0

【讨论】:

  • 感谢您的建议,但仍然不是我想要的。最后三列“Renewer”、“Caretaker”和“Skirmisher”不应包含在边缘列表中。我在想它应该做类似'对于每个特征 - 如果等于另一个特征 - (附加?)索引',以便我得到每个关系的列表(例如 0,1)
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2020-11-29
  • 2019-05-14
相关资源
最近更新 更多