有没有一种简单的方法可以将 pandas 系列转换为系列中值的比率交叉表?

Is there a simple way to convert a pandas series to a crosstab of ratios for values in the series?

输入

name    score
bob     2           
fred    4           
jim     1           
anne    5   

期望输出(得分比率:例如第 1 行中的 bob*fred = 2/4 等)

name    bob fred    jim anne
bob     1   0.5     2   0.4
fred    2   1       4   0.8
jim     0.5 0.2     1   0.2
anne    2.5 1.25    5   1

我们可以尝试使用外部 np.divide.outer 来计算 score 列的外部除法

n, s = df.to_numpy().T
pd.DataFrame(np.divide.outer(s, s), n, n)

      bob  fred  jim anne
bob   1.0   0.5  2.0  0.4
fred  2.0   1.0  4.0  0.8
jim   0.5  0.25  1.0  0.2
anne  2.5  1.25  5.0  1.0

您可以使用 df.corr 来计算自定义关系函数。请注意,对角线不是计算出来的,而是设置为 1.0.

仅当您的数据框中有两列以上时才需要选择相关列。

df[['name','score']].set_index('name').T.corr(lambda x,y: x/y)

输出

name  bob  fred  jim  anne
name                      
bob   1.0   0.5  2.0   0.4
fred  0.5   1.0  4.0   0.8
jim   2.0   4.0  1.0   0.2
anne  0.4   0.8  0.2   1.0

测试此解决方案的日期框架

import pandas as pd
import io

t = '''
name    score
bob     2           
fred    4           
jim     1           
anne    5   
'''

df = pd.read_csv(io.StringIO(t), sep='\s+')