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 BA 1.0 1 CA 0.8 2 DA 0.0 3 AB 0.5 4 CB 0.0 5 DB 0.0 6 AC 0.5 7 BC 0.0 8 DC 1.0 9 AD 0.0 10 BD 0.0 11 CD 0.2
melt was introduced as a function of the DataFrame object as 0.20 , but for older versions pd.melt needed 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)
Delay
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
source share