python - 如何从 Pandas 数据框创建边缘列表?

标签 python pandas dataframe network-analysis

我有一个形式为的 pandas 数据框 (df)-

    Col1
A  [Green,Red,Purple]
B  [Red, Yellow, Blue]
C  [Brown, Green, Yellow, Blue]

我需要将其转换为边缘列表,即以下形式的数据框:

Source    Target    Weight
  A         B         1
  A         C         1
  B         C         2

编辑 请注意,新数据框的行数等于可能的成对组合的总数。此外,要计算“权重”列,我们只需找到两个列表之间的交集即可。例如,对于 B&C,元素共享两种颜色:蓝色和黄色。因此,相应行的“权重”为 2。

最快的方法是什么?原始数据框包含大约 28,000 个元素。

最佳答案

首先,从数据框开始:

from itertools import combinations

df = pd.DataFrame({
        'Col1': [['Green','Red','Purple'], 
                 ['Red', 'Yellow', 'Blue'], 
                 ['Brown', 'Green', 'Yellow', 'Blue']]
     }, index=['A', 'B', 'C'])

df['Col1'] = df['Col1'].apply(set)    
df

                           Col1
A          {Purple, Red, Green}
B           {Red, Blue, Yellow}
C  {Green, Yellow, Blue, Brown}

Col1 中的每个列表都已转换为一个集合以有效地找到并集。接下来,我们将使用 itertools.combinations 创建 df 中所有行的成对组合:

df1 = pd.DataFrame(
    data=list(combinations(df.index.tolist(), 2)), 
    columns=['Src', 'Dst'])

df1

  Src Dst
0   A   B
1   A   C
2   B   C

现在,应用一个函数来获取集合的并集并找到它的长度。 SrcDst 列充当对 df 的查找。

df1['Weights'] = df1.apply(lambda x: len(
    df.loc[x['Src']]['Col1'].intersection(df.loc[x['Dst']]['Col1'])), axis=1)
df1

  Src Dst  Weights
0   A   B        1
1   A   C        1
2   B   C        2

我建议一开始就设置转换。每次都将您的列表即时转换为集合既昂贵又浪费。

为了加快速度,您可能希望将这些集合复制到新数据帧的两列中,因为不断调用 df.loc 会减慢一个档次.

关于python - 如何从 Pandas 数据框创建边缘列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44992103/

相关文章:

python - 将新列迭代添加到具有唯一列名称的数据框

python - 使用 Pandas 操作 CSV 文件 : Identifying a value in a column and using data from other columns of the same row

python - 在 Numpy Python 中修改数组 block

python - 如何按 dict 列过滤 pandas 数据框?

python - 使用提供给构造函数的数据列表在数据帧构造函数中设置多索引

Python - 如何直接从 Smartsheets 创建 pandas Dataframe?

python - 如何获取idmax-admin在时序数据中的分布?

python - 根据条件合并pandas数据框

python - Pandas:当组中的值落在某个范围内时,将组保留在数据中

r - 如何使用 POSIXct 类型的列初始化 data.frame?