有没有一种简单的方法可以将 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+')
输入
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+')