熊猫 - 从数据框架创建差异矩阵

alp*_*due 6 python pandas

我正在尝试创建一个矩阵来显示Pandas数据框中行之间的差异.

import pandas as pd

data = {'Country':['GB','JP','US'],'Values':[20.2,-10.5,5.7]}
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

我想这个:

  Country  Values
0      GB    20.2
1      JP   -10.5
2      US     5.7
Run Code Online (Sandbox Code Playgroud)

要成为这样的东西(差异垂直):

  Country     GB     JP     US
0      GB    0.0  -30.7   14.5
1      JP   30.7    0.0   16.2
2      US   14.5  -16.2    0.0
Run Code Online (Sandbox Code Playgroud)

这是通过内置函数实现的还是我需要构建一个循环来获得所需的输出?谢谢你的帮助!

ayh*_*han 9

这是numpy 广播的标准用例:

df['Values'].values - df['Values'].values[:, None]
Out: 
array([[  0. , -30.7, -14.5],
       [ 30.7,   0. ,  16.2],
       [ 14.5, -16.2,   0. ]])
Run Code Online (Sandbox Code Playgroud)

我们使用values属性访问底层的numpy数组,并[:, None]引入一个新轴,因此结果是二维的.

您可以使用原始系列连接:

arr = df['Values'].values - df['Values'].values[:, None]
pd.concat((df['Country'], pd.DataFrame(arr, columns=df['Country'])), axis=1)
Out: 
  Country    GB    JP    US
0      GB   0.0 -30.7 -14.5
1      JP  30.7   0.0  16.2
2      US  14.5 -16.2   0.0
Run Code Online (Sandbox Code Playgroud)

由于@Divakar,也可以使用以下代码生成数组:

arr = np.subtract.outer(*[df.Values]*2).T
Run Code Online (Sandbox Code Playgroud)

在这里,我们呼吁.outersubtractufunc,它适用于所有对其输入.

  • 只是为了变化或者是funsake:`np.subtract.outer(*[df.Values]*2)`. (3认同)