如何从pandas datrafame创建一个edgelist?

anhgbhbe  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(90)

我有一个pandas dataframe(df),其中包含1:连接的顶点和0:不连通顶点
| X型|B| C类|D级|
| - -----|- -----|- -----|- -----|
| F型|1| 1| 0|
| G级|0| 0| 1|
| H型|0| 1| 0|
我需要把它转换成一个edgelist:
| 来源|目标|
| - -----|- -----|
| F型|B|
| F型|C类|
| G级|D级|
| H型|C类|
最好的办法是什么?

hiz5n14c

hiz5n14c1#

您可以melt,过滤器和清理:

out = (df
   .melt('X', var_name='Target')
   .loc[lambda d: d.pop('value').eq(1)]
   .rename(columns={'X': 'Source'})
 )

输出:

Source Target
0      F      B
3      F      C
5      H      C
7      G      D

stack的替代:

out = (df
   .replace(0, pd.NA)
   .set_index('X')
   .stack()
   .rename_axis(['Source', 'Target'])
   .reset_index()
   .drop(columns=0)
 )

输出:

Source Target
0      F      B
1      F      C
2      G      D
3      H      C
3phpmpom

3phpmpom2#

下面是一个使用stack()并构造新df的方法。

df2 = (pd.DataFrame(
    df.set_index('X').where(lambda x: x.ne(0)).stack().index.tolist(),
    columns = ['X','Target']))

df.set_index('X').mul(df.columns[1:]).where(lambda x: x.ne('')).stack().droplevel(1).reset_index().set_axis(['X','Target'],axis=1)

df.set_index('X').dot(df.columns[1:] + ',').str.strip(',').str.split(',').explode().reset_index().set_axis(['X','Target'],axis=1)

输出:

X Target
0  F      B
1  F      C
2  G      D
3  H      C

相关问题