如何在Python中从邻接矩阵创建边列表数据框?

2024-03-29

我有一个 pandas 数据框(将其视为网络中节点的加权邻接矩阵)的形式,df,

    A    B    C    D
A   0   0.5   0.5  0 
B   1    0    0    0
C   0.8  0    0   0.2
D   0    0    1    0

我想获得一个代表边缘列表的数据框。对于上面的例子,我需要以下形式的东西,边列表df,

    Source    Target    Weight    
0   A           B        0.5 
1   A           C        0.5
2   A           D        0
3   B           A        1
4   B           C        0
5   B           D        0
6   C           A        0.8
7   C           B        0
8   C           D        0.2
9   D           A        0
10  D           B        0
11  D           C        1

创建这个最有效的方法是什么?


Using rename_axis + reset_index + melt:

df.rename_axis('Source')\
  .reset_index()\
  .melt('Source', value_name='Weight', var_name='Target')\
  .query('Source != Target')\
  .reset_index(drop=True)

  Source Target  Weight
0       B      A     1.0
1       C      A     0.8
2       D      A     0.0
3       A      B     0.5
4       C      B     0.0
5       D      B     0.0
6       A      C     0.5
7       B      C     0.0
8       D      C     1.0
9       A      D     0.0
10      B      D     0.0
11      C      D     0.2

melt已作为函数引入DataFrame对象截至0.20,对于旧版本,您需要pd.melt反而:

v = df.rename_axis('Source').reset_index()
df = pd.melt(
      v, 
      id_vars='Source', 
      value_name='Weight', 
      var_name='Target'
).query('Source != Target')\
 .reset_index(drop=True)

Timings

x = np.random.randn(1000, 1000)
x[[np.arange(len(x))] * 2] = 0

df = pd.DataFrame(x)
%%timeit
df.index.name = 'Source'
df.reset_index()\
  .melt('Source', value_name='Weight', var_name='Target')\
  .query('Source != Target')\
  .reset_index(drop=True)

1 loop, best of 3: 139 ms per loop
# Wen's solution

%%timeit
df.values[[np.arange(len(df))]*2] = np.nan
df.stack().reset_index()

10 loops, best of 3: 45 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中从邻接矩阵创建边列表数据框? 的相关文章

随机推荐