我有一个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类|最好的办法是什么?
hiz5n14c1#
您可以melt,过滤器和清理:
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的替代:
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
3phpmpom2#
下面是一个使用stack()并构造新df的方法。
stack()
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
2条答案
按热度按时间hiz5n14c1#
您可以
melt
,过滤器和清理:输出:
stack
的替代:输出:
3phpmpom2#
下面是一个使用
stack()
并构造新df的方法。或
或
输出: