在python Dataframe中为AB,BA对分配相同的随机值

kum*_*han 7 python dataframe pandas

我有一个像Dataframe这样的

 Sou  Des
  1    3
  1    4
  2    3
  2    4
  3    1
  3    2
  4    1
  4    2
Run Code Online (Sandbox Code Playgroud)

我需要为0到1之间的每一对分配随机值,但必须为类似的对分配相同的随机值,如"1-3","3-1"和其他对.我期待结果数据框如

 Sou  Des   Val
  1    3    0.1
  1    4    0.6
  2    3    0.9
  2    4    0.5
  3    1    0.1
  3    2    0.9
  4    1    0.6
  4    2    0.5
Run Code Online (Sandbox Code Playgroud)

如何在python pandas中为"AB"和"BA"分配相同的随机值类似的对.

Max*_*axU 6

让我们先创建一个按axis=1助手DF 排序:

In [304]: x = pd.DataFrame(np.sort(df, axis=1), df.index, df.columns)

In [305]: x
Out[305]:
   Sou  Des
0    1    3
1    1    4
2    2    3
3    2    4
4    1    3
5    2    3
6    1    4
7    2    4
Run Code Online (Sandbox Code Playgroud)

现在我们可以按列分组:

In [306]: df['Val'] = (x.assign(c=1)
                        .groupby(x.columns.tolist())
                        .transform(lambda x: np.random.rand(1)))

In [307]: df
Out[307]:
   Sou  Des       Val
0    1    3  0.989035
1    1    4  0.918397
2    2    3  0.463653
3    2    4  0.313669
4    3    1  0.989035
5    3    2  0.463653
6    4    1  0.918397
7    4    2  0.313669
Run Code Online (Sandbox Code Playgroud)