在pandas数据帧中按递增顺序重新排序节点

ubu*_*oob 5 python dataframe pandas

data1 = { 'node1': [2,2,3,6],
     'node2': [6,7,7,28],
     'weight': [1,2,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])
Run Code Online (Sandbox Code Playgroud)

我想按递增顺序重命名data1中的node1和node2.节点是2 3 6 7 28,因此它们分别变为1 2 3 4 5.

所以数据框变成了 -

data1 = { 'node1': [1,1,2,3],
     'node2': [3,4,4,5],
     'weight': [1,2,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])
Run Code Online (Sandbox Code Playgroud)

之前的数据看起来像这样

在此输入图像描述

但现在看起来像这样

在此输入图像描述

Flo*_*oor 7

通过整形分配和分配,即分解

df1[['node1','node2']] = (pd.factorize(np.sort(df1[['node1','node2']].values.reshape(-1)))[0]+1).reshape(-1,len(df1)).T

    node1  node2  weight
0      1      3       1
1      1      4       2
2      2      4       1
3      3      5       1
Run Code Online (Sandbox Code Playgroud)

使用dict进行融合和分解以及重命名的另一种方法

vals = pd.factorize(df1[['node1','node2']].melt().sort_values('value')['value'])

to_rename = dict(zip(vals[1],np.unique(vals[0]+1)))
# {2: 1, 3: 2, 6: 3, 7: 4, 28: 5}

df1[['node1','node2']] = df1[['node1','node2']].apply(lambda x : x.map(to_rename))
# Also df1[['node1','node2']] = df1[['node1','node2']].replace(to_rename) Thanks @jezrael

  node1  node2  weight
0      1      3       1
1      1      4       2
2      2      4       1
3      3      5       1
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

使用rank重塑stack,然后unstack:

df2 = (df1.set_index('weight', append=True)
          .stack()
          .rank(method='dense')
          .astype(int)
          .unstack()
          .reset_index(level=1))
print (df2)
   weight  node1  node2
0       1      1      3
1       2      1      4
2       1      2      4
3       1      3      5
Run Code Online (Sandbox Code Playgroud)